为了账号安全,请及时绑定邮箱和手机立即绑定

空隙的大小是多少?

/ 猿问

空隙的大小是多少?

C++ C
眼眸繁星 2019-11-14 14:39:26

这句话会产生什么?


void *p = malloc(sizeof(void));

编辑:问题的扩展。


如果sizeof(void)在GCC编译器中产生1,则分配1字节的内存,指针p指向该字节,p ++会增加到0x2346吗?假设p为0x2345。我说的是p,而不是* p。


查看完整描述

3 回答

?
交互式爱情

类型void没有大小;那将是一个编译错误。出于同样的原因,您不能执行以下操作:


void n;

编辑。令我惊讶的是,sizeof(void)实际上在GNU C中确实可以编译:


$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc -w - && ./a.out 

1

但是,在C ++中,它不会:


$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc++ -w - && ./a.out 

<stdin>: In function 'int main()':

<stdin>:1: error: invalid application of 'sizeof' to a void type

<stdin>:1: error: 'printf' was not declared in this scope


查看完整回答
反对 回复 2019-11-14
?
胡说叔叔

如果使用的是GCC,并且没有使用删除编译器特定扩展的编译标志,sizeof(void)则为1。GCC具有执行此操作的非标准扩展。


通常,void它是不完整的类型,您不能将sizeof用于不完整的类型。


查看完整回答
反对 回复 2019-11-14
?
蝴蝶刀刀

void没有大小。在C和C ++中,该表达式sizeof (void)均无效。


在C中引用N1570 6.5.3.4第1段:


的sizeof操作者不得应用于具有功能类型的表达式或不完整的类型,这样的类型的括号名称,或者将指定的位字段构件的表达式。


(N1570是2011 ISO C标准的草案。)


void是不完整的类型。本段是一个约束,这意味着任何符合标准的C编译器都必须诊断出对此有任何违反。(诊断消息可能是非致命警告。)


C ++ 11标准的措辞非常相似。在问了这个问题之后,两个版本都发布了,但是规则可以追溯到1989年的ANSI C标准和最早的C ++标准。实际上,不适用void的不完全类型的规则sizeof可以追溯到void对语言的介绍。


gcc的扩展名被视为sizeof (void)1。gcc默认情况下不是兼容的C编译器,因此在其默认模式下它不会发出警告sizeof (void)。即使对于完全兼容的C编译器,也可以使用这种扩展,但是仍然需要诊断。


查看完整回答
反对 回复 2019-11-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信