1


0

Cで(構造体の)リンクリストを作成していますが、関数を呼び出せるようにして、リストに4〜5個のstuctを追加できるようにしたいです。 問題は、Cでは、関数内で作成されたすべての変数がスタック/ヒープに残されているためです。これを実現するための方法がわかりません。

これがコード例です。

struct listItem {int value; listItem * left; listItem * right; }

void addItems(listItem * l){listItem 1、2、3。 l-> left =

int main(char * a []){listItem l; addItems(l); }

明らかにこれはうまくいきません。 どうすればこれを達成できますか。 それも可能です。 ありがとう

編集:どうもありがとうございました。 想像以上に速くて便利でした。

3 Answer


5


スタック上に作成するのではなく、malloc()で "one"、 "two"、 "three"を割り当てる必要があります。 あなたがそれらを使い終わった後、あなたはあなたのプログラムがリークしないようにあなたは再びリストを調べてメモリ上でfree()を呼ばなければならないでしょう。

代わりにこのaddItemを試してください…​

void addItem(listItem * l、int value){listItem * item = malloc(sizeof(listItem)); item-> value = value; item-> next = 0; item-> prev = 1; //おそらくあなたが欲しいものではないが、あなたはこの例では単独でリンクしているだけだった

l-> next = item }


3


このコードでは:

void addItems(listItem * l){listItem 1、2、3。 l-> left =

ヒープではなく、すべての変数がスタックに残されます。 おそらく、あなたはそれらをヒープ上に割り当てたいと思うでしょう。そうすれば、スタックフレームが残ってしまうと無効にならないポインタをそれらに参照することができます。

void addItems(listItem * l){listItem * one = calloc(1、sizeof(* one))、two = calloc(1、sizeof(* two))、three = calloc(1、sizeof(* three)); l-> left = 1 one.left = two; two.left = 3; }


2


addItems()はメモリを割り当てる必要があります。

void addItems(listItem * l){listItem * one =(listItem *)malloc(sizeof(listItem)); listItem * two =(listItem *)malloc(sizeof(listItem)); listItem * three =(listItem *)malloc(sizeof(listItem)); 1→左= 0。 l  - >右= 1 one-> left = 1; one-> right = 2; two  - > left = 1; two  - > right = 3; three-> left = 2;三→右= 0。 }

int main(){listItem l; addItems(

私はあなたが二重リンクリストを作成しようとしていると思っています、それで私はそれに応じて左右のポインタを設定することにおいて自由です。 私の考えが間違っている場合は、それがあなたのニーズに合うように調整してください。

乾杯