2017-03-07 84 views
-2

比方說,我有以下結構:指向結構的指針的大小是否隨着爲該結構分配內存而增加?

typedef struct 
    { 
    int length ; 
    int * data ; 
    } Array ; 

而在我的主要功能我做了以下內容:

int length = 10; 
char * filename = " data "; 
// create an object 
Array * arrptr1 = NULL ; 
printf (" sizeof (arrptr1) = % d \ n ", (int) sizeof (arrptr1)); 
arrptr1 = malloc (sizeof (Array)); 
printf (" sizeof (arrptr1) = %d , sizeof (Array) = % d \ n" , 
(int) sizeof (arrptr1) , (int) sizeof (Array)); 
// allocate memory for the data 
arrptr1 -> length = length ; 
arrptr1 -> data = malloc (sizeof (int) * (arrptr1 -> length)); 
printf (" sizeof (arrptr1) = %d , sizeof (arrptr1 -> data) = % d \ n " , 
(int) sizeof (arrptr1) , (int) sizeof (arrptr1 -> data)); 

什麼將要打印的每個打印報表?

我知道第一個打印,sizeof(arrptr1)只是一個垃圾值。

對於第二次打印,將sizeof(arrptr1) = 8和sizeof(Array) = 8以及?

第三個打印語句輸出什麼?

+1

指針的大小不會改變,但我想你詢問指針指向的內容的大小。 – Rob

+3

'sizeof(some_pointer_variable_or_type)'返回指針*的大小,而不是它指向的內容。 –

+2

指針包含結構的第一個字節的地址。爲什麼指針大小會增加? – StoryTeller

回答

4

我知道第一次打印,sizeof(arrptr1)只是一個垃圾值。

不,它將是指針的大小。例如,如果它是一個64位平臺,其中所有指針都是8個字節,那麼它將打印出8個。如果它沒有給你一個合理的值,你怎麼知道分配多少內存來存儲一個類型的實例?

對於第二次打印,sizeof(arrptr1)= 8和sizeof(Array)= 8以及?

不太可能。由於Array具有一個整數和一個指針,因此在具有8個字節指針和4個字節整數的平臺上,它可能會有16個字節。 (如果是12個字節的Array秒的陣列將有不對齊的所有其他元素。)

會是什麼樣的第三個print語句輸出?

這是一個常見的初學者錯誤,認爲sizeof關心什麼是你問它的大小的東西。它只是給出了相關類型的大小。

char * j; 
sizeof(j); // equivalent to sizeof(char*) 
sizeof(*j); // equivalent to sizeof(char) 

j = "hello"; 
sizeof(j); // still equivalent to sizeof(char*) 
sizeof(*j); // still equivalent to sizeof(char) 

j = malloc(32); 
sizeof(j); // still equivalent to sizeof(char*) 
sizeof(*j); // still equivalent to sizeof(char) 

你能想到的sizeof的告訴你,你需要多少個字符,以保持其參數的類型的實例。

+0

啊,我看到我的第一個錯誤。感謝您爲其他兩位作出明確的解釋和舉例。 –

0

sizeof(arrptr1)sizeof(arrptr1->data)都是指針的大小。指針是一個保存地址的變量。所有地址*都是相同的大小。所以這些將始終打印相同的值。

無論初始化還是未初始化,變量都具有相同的大小。

sizeof(Array)將返回大小Array的,包括一個int和指針的 - 這是最有可能的8或12,或16,如果你有一個8個字節的指針編譯器決定插入一些填充。

*(我相信函數地址都來自非函數的地址不同的大小,但你不使用這裏的任何函數指針)

+0

「所有地址*都是相同的大小」 - >不是真的。正如您所指出的,指向函數的指針的大小通常與對象指針的大小不同。 C即使在同一個平臺上也支持各種不同大小的指針'int *','char *'等等。 – chux