2013-06-23 31 views
-1

下面的程序給出的輸出4.我認爲它會輸出8的sizeof(int)的+的sizeof(無符號整數)這個結構的大小是多少?爲什麼?

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
     struct node 
     { 
       int a; 
       struct node * next; 
     }; 
     struct node * p= (struct node *) malloc(sizeof(struct node)); 
     printf("%d", sizeof(p)); 
} 
+3

你以指針的大小,而不是對象本身。 – Mysticial

+0

同樣重要的是要知道,如果你這個編譯爲32位或64位,作爲有差別來了'int'和指針有多大。 – Raceimaztion

回答

1

p只是一個指針。它的大小取決於ABI,這是你的情況。

+1

不,它將是一個指針的大小,它可能是也可能不是無符號整數的大小。 –

+0

你說得對,它是指針的大小。你錯在假定這個大小是什麼。 –

2

在這段代碼,p是一個指針,所以你只是打印指針的大小(這是在你的編譯器/操作系統組合顯然是4字節)。如果你想要結構的大小,你需要打印sizeof(*p)。此外,正如指出的那樣,使用「%d」爲size_t不一定會工作(「%俎」是正確的,雖然%d可在大多數的編譯器/操作系統在現實世界)。另外,你不應該假設結構的大小「應該」是8.指針可能更大,或者編譯器可能想要以某種奇怪的方式填充或對齊結構。

1

正確答案:您的輸出(如果有的話)是不確定的,因爲您在撥打printf()的電話中使用了錯誤的格式說明符。你應該使用%zu代替 - sizeof()產生size_t類型的對象。

因此,您的程序調用未定義的行爲,,它可以自由地執行(並打印)任何想要的東西。

+0

我相信將unsigned int轉換爲int不會導致未定義的行爲。它可能會將某些東西像255轉換爲8位系統上的-127。但不知道。未定義行爲的來源將不勝感激! –

+1

的一點是,'的sizeof(X)'不產生一個無符號的'int',它產生一個'size_t'。在大多數系統中,這與'unsigned int'相同,但不是必須的。 '%zu'是'size_t'的適當格式說明符,而'%d'可能會導致可怕的事情發生。 – amalloy