在没有创建对象的情况下从指针中查找结构的正确大小?

tgu*_*926 3 c struct pointers sizeof

对不起,如果标题令人困惑.这是我的结构:

struct l_list{
   int number;
   char *name;
   double value;
   struct l_list *next;
};

typedef struct l_list *PhoneBook;
Run Code Online (Sandbox Code Playgroud)

主功能:

int main(void){

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

   PhoneBook person1;

   printf("%u\n", sizeof(*person1));
   printf("%u\n", sizeof(PhoneBook));

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

20
20
4

据我所知,PhoneBook它显示的是4个字节,因为它只是指针的大小,但是如何从?找到实际结构的大小typedef PhoneBook?

Sha*_*our 5

您可以使用以下内容:

printf("%zu\n", sizeof( *(PhoneBook)NULL ) );
Run Code Online (Sandbox Code Playgroud)

重要的问题是为什么上面的有效,是不是你对指针进行间接处理会是未定义的行为?不,你不是因为除了可变长度数组之外根本没有评估.如果我们看看C99草案标准部分,运营商第2段的尺寸说明(强调我的):NULL sizeof6.5.3.4

sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称.大小由操作数的类型确定.结果是整数.如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量.

此外,我们在第5段中看到以下例子,证实了这一解读:

double *dp = alloc(sizeof *dp);
Run Code Online (Sandbox Code Playgroud)

在编译时,要确定表达式的类型以便计算结果.我们可以通过以下示例进一步证明这一点:

int x = 0 ;
printf("%zu\n", sizeof( x++ ));
Run Code Online (Sandbox Code Playgroud)

这不会增加x.

注意:%zu是一个独立于平台的格式说明符,用于结果sizeof.


小智 4

你可以做:

printf("%u\n", sizeof(*(PhoneBook) NULL) );
Run Code Online (Sandbox Code Playgroud)

  • 您能解释一下“PhoneBook”周围的括号是如何/做什么的吗?您是否定义了 NULL 对象,然后取消引用它..? (2认同)