0

C で LinkedList を作成する必要があります。headstruct element { int value; struct element * next; }; 要素も定義したので、ファイルに構成を定義しました。これらはどちらもローカルではなく、ランタイム全体で持続する変数です。外部から-values を使用して要素を LinkedList に挿入しようとすると、 this をラップintする必要があります。これを行うには、ローカル変数を作成します。head が null の場合は head にします。それ以外の場合は、for ループを使用して追加します。elementintstruct element e = { value; 0 };

私が考え出した問題は、その関数の終了時eにタイプのローカル変数struct elementが削除されることです。したがって、ヘッドが を指している場合、ローカル変数は関数呼び出しを超えて保持されないeため、メモリの未割り当てポイントを指し続けます。e

前もって感謝します!

4

2 に答える 2

4

これはstruct element e = { value; 0 };、要素をスタックに割り当てるためです。関数スコープが終了すると、スタックは自動的に割り当て解除 (削除) されます。アクティブなスコープのスタック メモリのアドレス指定は完全に有効ですが、終了したスコープのアドレス指定は未定義の動作です。

malloc(sizeof(struct element));関数スコープを介して永続化するには、ヒープに割り当てる必要があります。

struct element *e = calloc(1, sizeof(struct element));
e->value = value;

return e;

注:callocゼロ化されたメモリをmalloc割り当て、内容が未定義のメモリを割り当てます。

于 2012-10-27T12:49:19.513 に答える
0

タイプstruct elementのリストの動的に割り当てられた項目を使用する必要があります。

p_element = (struct element*)malloc(sizeof(struct element));
// check if successfully allocated
// initialize element fields: p_element->value = ...
p_element->next = NULL; // always terminator
if (!gp_head_element)
    // initialize head
    gp_head_element = p_element;
else {
    //  search for the end of list and append
}  
于 2012-10-27T12:53:50.793 に答える