2013-05-28 55 views
3

所以我試圖創建一個動態數組在C中,使用malloc,但由於某種原因,它不工作。這裏是我的代碼:動態內存分配C中的陣列

int* test = (int*) malloc(20 * sizeof(int)); 
    printf("Size: %d\n", sizeof(test)); 

控制檯輸出8,當我運行這段代碼,雖然理想情況下應該輸出80,我相信,因爲一個int的大小爲4,和我創建它們的20。那麼,爲什麼這不起作用呢?謝謝你的幫助。 :)

+1

記得檢查一下malloc的返回值,檢查文檔是否爲.... –

+3

旁註:在C編程時,請不要強制轉換'malloc'的返回值。 –

回答

7

sizeof運算符返回一個int*的大小,它只是一個指針。在C中,當您使用malloc動態分配內存時,對malloc的調用將返回一個指向新分配的內存塊的指針(通常位於堆上)。指針本身只是一個內存地址(通常只佔用4或8個字節在大多數現代系統上)。您需要跟蹤自己分配的實際字節數。

C語言將只跟蹤靜態分配的緩衝區(堆棧數組)的緩衝區大小,因爲數組大小在編譯時可用。

int test[100]; 
printf("Sizeof %d\n", sizeof(test)) 

這將打印等於100 * sizeof(int)(通常在最現代化的機器400)

+0

感謝您的回覆。那麼如何獲得動態數組的大小呢? –

+2

@Mr Cherno,你不能使用標準的ANSI-C。您必須使用單獨的變量自行跟蹤它。 (你知道你分配了一個等於'20 * sizeof(int)'的大小的緩衝區)。 –

+0

好的,非常感謝。 :) –

2

這裏sizeof運營商是給你存儲的int*
所需的字節數的值,即它相當於sizeof(int*);
根據不同的編譯器可能會給你帶來48

在C程序員的工作是跟蹤動態分配的字節數。

0

如果您嘗試打印sizeof(& test)的值,您將得到80(20 * 4)。 &測試類型爲int(*)[20]。

我希望它能澄清你的疑問。