sizeof(*ptr)和sizeof(struct)之间的差异

sizeof(*ptr)和sizeof(struct)之间的差异,c,sizeof,C,Sizeof,我尝试了以下程序 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 tem

我尝试了以下程序

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(*指针)
的使用。如果两者相同,为什么使用
sizeof(*pointer)
呢?

我通常更喜欢
sizeof(*ptr)
,因为如果您稍后返回并更改代码,使
ptr
现在具有不同的类型,则不必更新
sizeof
。在实践中,您可以更改
ptr
的类型,而不必意识到再往下几行,您就得到了结构的大小。如果您没有冗余地指定类型,那么如果您以后需要更改它,那么您将不会把它搞砸

从这个意义上讲,它是一种“可维护性代码”或“代码防御”之类的东西


其他人可能有他们的主观原因。通常要键入的字符较少。:-)

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
的类型,您只需在一个地方更改代码。

我还认为这是一个很好的例子,说明如何使用编译器的类型系统为您带来好处,因为如果调用者不显式转换指针类型或发出警告,就无法溢出
*ptr
。我还喜欢
\u Static\u assert(sizeof(*ptr)=sizeof(thetype\u t),“您没有完成对代码的修改。”)出于这个原因。