2016-05-02 11 views
1

教授がリンクリストの例として挙げた関数の例を理解するのに少し問題があります。割り当てられたメモリは実際にメインのスコープにはないようです。しかし、それは動作するようです。ここでは例の機能は次のとおりです。リンクリスト関数を使用したメモリの範囲

#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がグローバルではないと思った。読んでくれてありがとう!うまくいけば誰かが私の混乱を助けることができます。

+0

BTW 'r = make_root();'これはうまくいかないかもしれません。 – BLUEPIXY

答えて

3

mallocは、ヒープメモリの割り当て方法です。割り当てられたメモリは、ポインタが明示的にfree -edになるまでスティックされます。そのポインタにアクセスできる人は、ポインタがfreeに渡されるまでそれを使用することができます。

mallocは、それがグローバル空間にあらかじめ割り当てられていないメモリへのポインタを返すことができるという意味で、「グローバル」ではありませんが、それは時にスコープは内mallocそれが割り当てるメモリが自動的に廃棄されるという意味ではありません出口と呼ばれました。

関連する問題