這個問題在這里已經有了答案: 在 malloc 的記憶體上使用 sizeof() [重復] (5 個回答) 關于 malloc 和 sizeof 的新手問題 (8 個回答) 2 小時前關閉。
我正在學習 C 動態記憶體分配,但無法弄清楚為什么malloc或calloc不分配為 struct 陣列指定的記憶體量,也不為名稱 char 陣列分配記憶體。
代碼示例:
struct spaceShip{
long long int distance; // 8 bytes
int numParts; // 4 bytes
char *name; // 1 byte
}; // 13 bytes total
int main (int argc, char *argv[]){
int amount=10;
struct spaceShip *spaceShipArray;
printf("size of struct spaceShip = %d bytes\n", sizeof(struct spaceShip));
spaceShipArray = malloc(amount * sizeof(*spaceShipArray));
printf("size of spaceShipArray = %d bytes\n", sizeof(*spaceShipArray));
spaceShipArray[0].name = malloc(100 * sizeof(char));
printf("size of name char array = %d \n", sizeof(spaceShipArray[0].name));
free(spaceShipArray);
return 0;
}
輸出:
size of struct spaceShip = 16 bytes //I guess because of the pagination mechanism it takes more?
size of spaceShipArray = 16 bytes // not ok. should be 160
size of name char array = 4 // not ok. should be 100
uj5u.com熱心網友回復:
首先要輸出該型別的物件,size_t您必須使用轉換說明符%zu。例如
printf("size of struct spaceShip = %zu bytes\n", sizeof(struct spaceShip));
這兩種說法
printf("size of struct spaceShip = %zu bytes\n", sizeof(struct spaceShip));
printf("size of spaceShipArray = %zu bytes\n", sizeof(*spaceShipArray));
輸出相同的值,因為運算式sizeof(*spaceShipArray)等價于運算式sizeof(struct spaceShip)。
即取消參考指標spaceShipArray給出了一個型別的物件struct spaceShip。指標對指向單個物件還是指向陣列的第一個元素一無所知。
如果你想輸出分配記憶體的大小,那么你應該寫例如
printf("size of spaceShipArray = %zu bytes\n", amount * sizeof(*spaceShipArray));
這個說法
printf("size of name char array = %zu \n", sizeof(spaceShipArray[0].name));
輸出型別指標的大小,char *因為它是運算式的型別spaceShipArray[0].name。
所以程式輸出是正確的。
考慮到您忘記釋放為字符陣列分配的記憶體。例如
free( spaceShipArray[0].name );
free(spaceShipArray);
uj5u.com熱心網友回復:
第一個輸出:char* 在舊計算機(32 位)上使用 4 個位元組,在現代計算機(64 位)上使用 8 個位元組,因為它是一個指標(不是單個字符)。第二個輸出:它是正確的,因為它是向量的單個元素的大小(16 位元組) 第三個輸出:它是正確的,因為 sizeof 回傳字符指標的大小(32 位計算機上的 4 個位元組)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335216.html
