sizeof(*ptr)和sizeof(struct)之间的区别

4
我尝试了以下程序。
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)
2个回答

15

我通常更喜欢使用sizeof(*ptr),因为如果您稍后返回并更改了代码,使得ptr现在具有不同的类型,则不必更新sizeof。实际上,您可以更改ptr的类型,而没有意识到几行下面,您正在获取结构的大小。如果您没有冗余地指定类型,那么如果以后需要更改它,出错的机会就会更少。

从这个意义上说,这是那些"代码可维护性"或者"代码防御性"的东西之一。

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


我认为这是使用编译器类型系统的一个很好的例子,因为除非调用者显式地进行指针类型转换或发出警告,否则无法越过*ptr。出于这个原因,我也喜欢_Static_assert(sizeof(*ptr)==sizeof(thetype_t),"You didn't finish modifying the code."); - David Perek

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接