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?
您可以使用以下内容:
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)