【发布时间】:2021-05-06 02:33:47
【问题描述】:
拥有这个简单的代码:
#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));
}
输出:
sizeof arg: 1
the real sizeof struct foo: 8
如您所见,该函数显示错误的结果。如果原因是invalid application of ‘sizeof’ to incomplete type,那为什么会显示sizeof arg: 1? void 不是 1 字节长,而是不完整的类型,那为什么会是这个结果呢?
【问题讨论】:
-
您对一个考虑不周的语言扩展感到困惑,一些具有邪恶幽默感的恶作剧者决定在 GCC 中默认启用该扩展。我的建议是禁用所有语言扩展。
-std=c11 -Wall -Werror -pedantic是一种方法。 -
鉴于
void *arg,sizeof( *arg )是无效代码。您不能取消引用void *指针。
标签: c sizeof void incomplete-type