2011-05-08 42 views
0

分配值0的整數我有一個鏈表結構是這樣的malloc - C程序 - 在GCC

typedef struct list_node { 
    int data; 
    struct list_node *next; 
}l_node; 

void print_list(l_node *head) { 
    l_node *cur_node = head; 
    while(cur_node!=NULL) { 
     printf("%d\t", cur_node->data); 
     cur_node = cur_node->next; 
    } 
} 

void main() { 
    printf("List"); 
    l_node *new_node = (l_node*)malloc(sizeof(l_node)); 
    print_list(new_node); 
} 

當我編譯GCC linkedlist.c做./a.out 我得到的輸出 名單我試圖訪問無效的內存位置在cur_node-> next)。但是,當我在VC++中嘗試它時,我得到錯誤(因爲我試圖訪問無效的內存位置cur_node->下一步)。

那麼,gcc的malloc默認情況下是否將0值分配給結構體內的整型變量?爲什麼我在gcc中執行相同的print_list時沒有得到相同的錯誤?

回答

2

malloc返回的內存內容未初始化。在初始化之前,您無法讀取該內存(至少寫入一次)。

gcc可能會「幫助」零初始化內存,但這種行爲不是必需的。 Visual C++ C運行時(CRT)將在發佈版本中爲您提供未初始化的內存(以獲得最佳性能),並在調試版本中使用特殊填充字節0xcd對內存進行初始化(以幫助您找到可能使用未初始化內存的位置)。

所以,基本上,你需要在使用它之前初始化內存。如果您希望運行時在給予您之前將堆塊初始化爲零,則可以使用calloc

+0

感謝:-)剛剛讀到關於calloc – harihb 2011-05-08 06:44:29

1

需要分配new_node->next = NULL因爲你檢查當前的節點爲空或不是,而malloc不初始化任何價值分配的空間,所以沒有出示擔保,該值將被初始化。爲了安全起見,您需要手動將NULL分配給鏈接列表的尾部或無效指針。