所以我試圖創建一個動態數組在C中,使用malloc,但由於某種原因,它不工作。這裏是我的代碼:動態內存分配C中的陣列
int* test = (int*) malloc(20 * sizeof(int));
printf("Size: %d\n", sizeof(test));
控制檯輸出8,當我運行這段代碼,雖然理想情況下應該輸出80,我相信,因爲一個int的大小爲4,和我創建它們的20。那麼,爲什麼這不起作用呢?謝謝你的幫助。 :)
所以我試圖創建一個動態數組在C中,使用malloc,但由於某種原因,它不工作。這裏是我的代碼:動態內存分配C中的陣列
int* test = (int*) malloc(20 * sizeof(int));
printf("Size: %d\n", sizeof(test));
控制檯輸出8,當我運行這段代碼,雖然理想情況下應該輸出80,我相信,因爲一個int的大小爲4,和我創建它們的20。那麼,爲什麼這不起作用呢?謝謝你的幫助。 :)
sizeof
運算符返回一個int*
的大小,它只是一個指針。在C中,當您使用malloc
動態分配內存時,對malloc
的調用將返回一個指向新分配的內存塊的指針(通常位於堆上)。指針本身只是一個內存地址(通常只佔用4或8個字節在大多數現代系統上)。您需要跟蹤自己分配的實際字節數。
C語言將只跟蹤靜態分配的緩衝區(堆棧數組)的緩衝區大小,因爲數組大小在編譯時可用。
int test[100];
printf("Sizeof %d\n", sizeof(test))
這將打印等於100 * sizeof(int)
(通常在最現代化的機器400)
感謝您的回覆。那麼如何獲得動態數組的大小呢? –
@Mr Cherno,你不能使用標準的ANSI-C。您必須使用單獨的變量自行跟蹤它。 (你知道你分配了一個等於'20 * sizeof(int)'的大小的緩衝區)。 –
好的,非常感謝。 :) –
這裏sizeof
運營商是給你存儲的int*
所需的字節數的值,即它相當於sizeof(int*);
根據不同的編譯器可能會給你帶來4
或8
在C程序員的工作是跟蹤動態分配的字節數。
如果您嘗試打印sizeof(& test)的值,您將得到80(20 * 4)。 &測試類型爲int(*)[20]。
我希望它能澄清你的疑問。
記得檢查一下malloc的返回值,檢查文檔是否爲.... –
旁註:在C編程時,請不要強制轉換'malloc'的返回值。 –