2011-09-09 43 views
6

考虑下面的代码片段:的sizeof()应用于结构和可变

struct foo { 
    int a; 
    int b; 
    int c; 
}; 

struct foo f; 
printf("%u, %u\n", sizeof(struct foo), sizeof(f)); 

的代码返回相同的数值,但如果的sizeof()适用于可变我想知道是否正确,或这仅仅是巧合吗?

谢谢。

+0

你试过谷歌搜索“sizeof applied to variable”吗?前两个结果(其中一个来自StackOverflow)将能够回答你的问题。 –

+0

是的,'sizeof'表达式都返回相同的值。请注意,第二个不需要括号; 'sizeof'是一个运算符,而不是一个函数。但'%u'需要'unsigned int'类型的参数,而不是'size_t'。写这个:'printf(“%lu%lu \ n”,(unsigned long)sizeof(struct foo)); printf(“%zu%zu \ n”,sizeof(struct foo),sizeof f) ,(unsigned long)sizeof f);'。 '%zu'是C99特有的功能;你的系统的'printf' mignt不支持它。 –

回答

6

两者都会和应该确实返回相同的值。

从MSDN:

sizeof运算符
sizeof运算符给出的存储量,以字节为单位来存储操作数的类型的对象必需的。该操作员可以避免在程序中指定与机器相关的数据大小。

sizeof unary-expression 
sizeof (type-name) 
1

这与预期的一样,即两者将返回相同的值。该值在编译时计算。

sizeof中使用变量通常是一种很好的做法,因为您稍后可能会更改类型,因此大小也可能会发生变化。

0

一般来说,最好将它应用于变量。如果变量的类型改变,它将保持正确。

+0

这种方式的缺点是,如果将变量的类型从“只是结构”更改为“指向结构的指针”,那么sizeof(变量)将变为4(或8取决于体系结构),编译器会高兴地接受它,警告。 – ivanzoid

5

sizeof适用于类型表达式。当您将其应用于某个类型时,()sizeof语法的一部分:sizeof(type)。当您将它应用于表达式()不属于sizeof语法的一部分:sizeof expression

因此,您的第二个sizeof不是真正“适用于变量”。它适用于表达式(f)。该表达式由包含在冗余对()中的单个变量f组成。您也可以不使用冗余对(),而只使用sizeof f

sizeof应用于表达式时,它返回表达式结果的大小(即表达式所具有的类型的大小)。在你的例子中,两个应用程序sizeof保证评估为相同的值。

实际上,一个很好的编程习惯是尽可能地避免sizeof(type),即倾向于使用sizeof expression。这使得你的代码更加独立于类型,这总是一件好事。类型名称属于声明而不属于其他地方。