2013-06-23 29 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