我尝试了以下程序
struct temp{
int ab;
int cd;
};
int main(int argc, char **argv)
{
struct temp *ptr1;
printf("Sizeof(struct temp)= %d\n", sizeof(struct temp));
printf("Sizeof(*ptr1)= %d\n", sizeof(*ptr1));
return 0;
}
输出
Sizeof(struct temp)= 8
Sizeof(*ptr1)= 8
在Linux中,我在很多地方都观察过sizeof(*pointer)
的用法。如果两者相同,为什么使用sizeof(*pointer)
?
答案 0 :(得分:13)
我通常更喜欢sizeof(*ptr)
,因为如果您稍后返回并更改代码,ptr
现在有不同的类型,则无需更新sizeof
。在实践中,您可以更改ptr
的类型,而不会意识到进一步向下,您正在采用结构的大小。如果你没有冗余地指定类型,那么如果你以后需要更改它,你就不太可能搞砸它。
从这个意义上讲,它是“可维护性代码”或“代码防御性”类型之一。
其他人可能有其主观原因。输入的字符通常较少。 : - )
答案 1 :(得分:1)
sizeof
以两种方式之一工作:1)带有表达式的类型,2)。后一种情况与在表达式类型上调用sizeof
相同。
所以你可以这样写:
int a;
char p[sizeof(int)];
char q[sizeof a];
两者意味着同样的事情。
表达式用于声明指向动态内存的指针的实用程序是你只需要拼出一次类型:
complex_type * pc = malloc(sizeof(*pc) * 100); // room for 100 elements
如果您稍后选择更改*pc
的类型,则只需在一个位置更改代码。