繁体   English   中英

sizeof 运算符在 c 中显示错误的结构大小

[英]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.4 sizeof_Alignof运算符

约束

1 sizeof运算符不得应用于具有 function 类型或不完整类型的表达式、此类类型的括号名称或指定位字段成员的表达式。 _Alignof运算符不应应用于 function 类型或不完整类型。
C 2011年在线草案

void是无法完成的不完整类型 - 您无法创建该类型的 object,因此在其上使用sizeof是编码错误,句号。

但是,出于某种原因,某些实现决定让sizeof (void)评估为 1,除非您处于“迂腐”模式。 显然有人认为它在某些情况下很有用,但我不建议使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM