[英]sizeof operator shows wrong size of struct in c
有这个简单的代码:
#include <stdio.h>
typedef struct
{
int a;
char c;
} foo;
void func(void *arg)
{
printf("sizeof arg: %ld\n", sizeof(*arg));
}
int main()
{
foo f = {6, 'c'};
func(&f);
printf("the real sizeof struct foo: %ld\n", sizeof(f));
}
output:
sizeof arg: 1
the real sizeof struct foo: 8
如您所见,function 显示错误的结果。 如果原因是'sizeof' 对不完整类型的无效应用,那么为什么它显示sizeof arg: 1
? void
不是1
个字节长,而是不完整的类型,那么为什么会出现这个结果呢?
您正在尝试获取 C 标准不允许的void
大小。 但是,某些实现将sizeof(void)
定义为 1,这就是您在此处看到的。
function 无法知道您传递的void *
实际上是foo *
。 您将需要其他方式来传达该信息。
这个说法
printf("sizeof arg: %ld\n", sizeof(*arg));
是不正确的。 表达式*arg
具有不完整的类型void
。 你需要写
printf("sizeof arg: %ld\n", sizeof(* ( foo * )arg));
C 的早期版本没有void
类型。 相反,类型char
被用作类型void
。 由于sizeof( char )
始终等于1
,因此一些编译器为了向后兼容 C 的旧规范,将sizeof( void )
设置为1
,尽管从 C 标准的角度来看它是不正确的。
结果应该是诊断结果,因为sizeof (void)
( sizeof (*arg)
解析为)是违反约束的:
6.5.3.4C 2011年在线草案sizeof
和_Alignof
运算符
约束
1sizeof
运算符不得应用于具有 function 类型或不完整类型的表达式、此类类型的括号名称或指定位字段成员的表达式。_Alignof
运算符不应应用于 function 类型或不完整类型。
void
是无法完成的不完整类型 - 您无法创建该类型的 object,因此在其上使用sizeof
是编码错误,句号。
但是,出于某种原因,某些实现决定让sizeof (void)
评估为 1,除非您处于“迂腐”模式。 显然有人认为它在某些情况下很有用,但我不建议使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.