2011-11-06 91 views
2

考慮下面的代碼:malloc和堆在C

#include "list.h" 
struct List 
{ 
    int size; 
    int* data; 
}; 
List *list_create() 
{ 
    List *list; 
    printf("%d %d",sizeof(list),sizeof(List)); 
    list = malloc(sizeof(list)); 
    assert(list != NULL); 
    if (list != NULL) { 
     list->size = 0; 
    } 
    return list; 
} 

印出數爲「4 8」,我相信這是由「INT大小」在列表對象所採取的4個字節和大小「int * data」爲0是什麼都沒有分配給數據? int指針的大小也是4字節,所以類型List共佔用8個字節?還是還有其他的事情呢?有人能幫我詳細瞭解這一切嗎?

然後malloc()從堆中獲取4個字節並將地址分配給指針列表?後來主要如果我做「list-> data [i] = 1;」這會給我一個運行時錯誤爲什麼?是否因爲我不能改變堆中的內容?但如果我做「列表 - >大小++」這將工作, 是不是整個列表對象是在堆?

真的需要這裏一些幫助提前

感謝。

+0

如果sizeof(struct List)''怎麼辦? – Aif

+0

您的運行時錯誤是因爲您尚未初始化任何指針。你也需要爲它分配空間。 – Ryan

+0

這裏沒有運行時錯誤。 –

回答

4

sizeof(List*)是指向List結構體的指針的大小。

sizeof(list)在您的情況下,因爲變量列表類型爲List*sizeof(List*)相同。

sizeof(List)取而代之的是struct List的大小,它包含兩個32位變量(我假設你明顯地使用了一個32位編譯器),一個整數和一個指針,並且你的編譯器決定你的結構的正確大小是8個字節。

指向類型的指針通常是32位編譯器中的4個字節和64位編譯器中的8個字節。作爲一個方面說明,閱讀你的代碼,但是我讀過你永遠不會初始化list-> data,你應該把它初始化到我猜想的某個地方。

這是C++然而,你應該寫

typedef struct { ... } List; // This is C. 

sizeof操作符在編譯時計算,而不是在運行時,它給出了一個類型的大小隻有信息。例如,你不能知道在sizeof的動態數組中有多少元素,如果你試圖完成這個,sizeof(指針)會給你指針類型的字節大小。

因爲有所瞭解什麼是一個指針,什麼是一個數組,我建議你讀http://www.lysator.liu.se/c/c-faq/c-2.htmlhttp://pw1.netcom.com/~tjensen/ptr/pointers.htm

+0

錯誤:指針大小由編譯器決定,而不是系統。在64位系統上進行32位編譯並不是一件罕見的事情,這意味着sizeof(void *)= 4 – chacham15

+0

Ok :)重新表達,但尚不清楚。 –

+0

您也忘記了對齊會影響結構的大小 – chacham15

2

技術上你的代碼中有一個錯誤。

代碼應爲:sizeof(struct List)typedef struct List List;某處。

但是,sizeof(list)是變量列表的大小。由於名單是一個指針,它相當於sizeof(void*),您的系統上安裝/編譯器是4

sizeof(struct List)是這是sizeof(int) + sizeof(int*) + any alignment issues的結構的大小。對齊的東西經常被遺忘,但是非常重要,因爲它可以以意想不到的方式改變結構的大小。