2017-06-20 13 views
-4

は私が試験中にこのコードを与え、そしてそれが何をするかを説明するのに必要だった: (ソースは英語ではなかったので、私は、いくつかの名前を変更)ポインタとローカル変数

#include <stdlib.h> 

typedef int typeInfoSCL; 
struct elemSCL 
{ 
    typeInfoSCL info; 
    struct elemSCL* next; 
}; 

typedef struct elemSCL TypeElemSCL; 
typedef TypeElemSCL* TypeSCL; 

void list_add(TypeSCL *scl, typeInfoSCL e) 
{ 
    TypeSCL tmp = *scl; 
    *scl = malloc(sizeof(struct elemSCL)); 
    (*scl)->info = e; 
    (*scl)->next = tmp; 
} 

int main() 
{ 
    TypeSCL scl1 = NULL; 
    list_add(&scl1, 3); 
    list_add(&scl1, 5); 
    TypeSCL tmp = malloc(sizeof(struct elemSCL)); 
    tmp->next = scl1; 
    list_add(&tmp, 7); 
} 

私はtmp以来のことを考えましたlist_add内のローカル変数、この文である:メソッドが呼び出された後、scl->nextがもう存在しないので、

(*scl)->next = tmp; 

は、間違ってないだろう。

テストで私が間違っていることが判明しました。どうしてこんなことに?割り当て

(*scl)->next = tmp; 

であなたの代わりにあなただけの場所である(tmpの内容をコピーし、変数(*scl)->nextポイントを作らない

+4

このコードはコンパイルされません。コンパイル可能なコードを投稿してください。あなたはおそらくすべての名前を適切に変更していないでしょう。 –

+0

これは何らかの擬似コードであり、実際のCではないので、質問に答えることは不可能です。特に、関数の戻り値の型が欠落していると、応答しようとするすべての違いが生じます。 – Lundin

+0

ここでいくつかの '*'を見逃していると仮定します: 'struct elemSCL next;' – Gerhardh

答えて

2

変数tmpがローカル変数である一方、どこが指しているか)を(*scl)->nextに設定します。

割り当て後、2つのポインタ((*scl)->nexttmp)が同じメモリを指しています。関数が返って、tmpがスコープ外に出ると、(*scl)->nextは引き続きその値を保持し、同じメモリを指し続けます。

+0

'struct elemSCL'型の変数を作成すると' struct elemSCL'に 'struct elemSCL'というメンバがあり、' struct elemSCL * 'ではなく、プログラムが最終的にメモリから外れてしまうと思いませんか?私はこれもまた問題の1つであるべきだということを意味します。 –

+0

@GAURANGVYAS私はOPの "翻訳"のために、表示されたコードに多くのタイプミスがあると仮定します。主なポイントは、変数間の他の割り当てと同様にポインタがコピーされることです。 –

関連する問題