教授がリンクリストの例として挙げた関数の例を理解するのに少し問題があります。割り当てられたメモリは実際にメインのスコープにはないようです。しかし、それは動作するようです。ここでは例の機能は次のとおりです。リンクリスト関数を使用したメモリの範囲
#define NEW(x) (x*)malloc(sizeof(x))
NODE *make_node (void *data) {
NODE *temp;
temp = NEW(NODE);
if (temp != NULL) {
temp->data = data;
temp->next = NULL;
}
return temp;
}
int insert_at_tail(ROOT *r, DATA *d) {
NODE *temp;
temp = make_node(d);
if (temp == NULL) // fail, cannot create new NODE
return -1;
if (r == NULL) {
r = make_root();
if (r == NULL) // fail, cannot create ROOT
return -1;
}
(r->num)++;
if (r->num == 1) { // if previously the list is empty
r->head = r->tail = temp;
}
else {
r->tail->next = temp;
r->tail = temp;
}
return 0;
}
関数のinsert_at_tailは、関数insert_at_tailにメモリ位置を返すmake_node関数を呼び出すように私には思えます。しかし、そのメモリの場所はその機能の範囲にありますか?その後、メモリはリンクリストデータに割り当てられます。メイン関数でリンクリストデータがそのメモリにまだアクセスできるようになったらどうなりますか?私はmallocがグローバルではないと思った。読んでくれてありがとう!うまくいけば誰かが私の混乱を助けることができます。
BTW 'r = make_root();'これはうまくいかないかもしれません。 – BLUEPIXY