MaximPro Asked:2020-01-06 20:07:50 +0000 UTC2020-01-06 20:07:50 +0000 UTC 2020-01-06 20:07:50 +0000 UTC 大小(无效)== 1? 772 我不小心打错了,从操作员那里得到了 sizeof - 1。 #include "stdio.h" int main(void) { printf("%d",sizeof(void)); /// 1 return 0; } 有人可以向我解释这里出了什么问题吗? c 2 个回答 Voted Best Answer Vlad from Moscow 2020-01-06T20:43:48Z2020-01-06T20:43:48Z 根据 C 标准(第 6.2.5 节类型) 19 void 类型包含一组空值;它是一个不完整的对象类型,无法完成。 和(6.5.3.4 sizeof 和 alignof 运算符) 1 sizeof 运算符不应应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位域成员的表达式。alignof 运算符不应应用于函数类型或不完整类型。 但是,一些编译器有自己的语言扩展,仍然将表达式定义sizeof( void )为具有值 1。 这是因为该类型void并没有立即出现在 C 编程语言中。来自 Rationale for International Standard—Programming Languages—C section 6.4.1 Keywords C89 中添加了几个关键字:const、enum、signed、void和 volatile。 以前,它的作用是由 type 扮演的char。例如,如果您想使用标准函数将一个对象复制到另一个对象memmove,则相应的条目可能如下所示 memmove( ( char *)obj1, ( char * )obj2, n ); 这种类型的记录仍然可以在旧程序中找到。 该函数当前memmove具有以下声明 void *memmove(void *s1, const void *s2, size_t n); 而且,如您所知,任何指针都可以隐式转换为 type void *,因此调用此函数不需要显式类型转换。你可以简单地写 memmove( obj1, obj2, n ); 将此函数与任何类型的指针一起使用时。 并且随着时间的推移,我 C 被引入了 type void。 来自国际标准的基本原理—编程语言—C 部分 6.5.4 转换运算符 因此,新类型 void* 与 char* 具有相同的表示形式,更适用于任意指针 与 type 类比char,由于指针与指针void *具有相同的表示形式char *,因此一些编译器将大小void设为 1,因为它sizeof( *(char *)NULL )等于 1。但是,根据 C 标准,此类型没有大小,因为它始终不完整的类型 ,因此构造如sizeof( void ),是不正确的,如果在编译程序时禁用了自己的扩展,编译器应该生成错误消息。 dio4 2020-01-06T20:13:48Z2020-01-06T20:13:48Z printf("%lu",sizeof(void)); 所以更准确地说。这是 void 类型的大小。
根据 C 标准(第 6.2.5 节类型)
和(6.5.3.4 sizeof 和 alignof 运算符)
但是,一些编译器有自己的语言扩展,仍然将表达式定义
sizeof( void )
为具有值 1。这是因为该类型
void
并没有立即出现在 C 编程语言中。来自 Rationale for International Standard—Programming Languages—C section 6.4.1 Keywords以前,它的作用是由 type 扮演的
char
。例如,如果您想使用标准函数将一个对象复制到另一个对象memmove
,则相应的条目可能如下所示这种类型的记录仍然可以在旧程序中找到。
该函数当前
memmove
具有以下声明而且,如您所知,任何指针都可以隐式转换为 type
void *
,因此调用此函数不需要显式类型转换。你可以简单地写将此函数与任何类型的指针一起使用时。
并且随着时间的推移,我 C 被引入了 type
void
。来自国际标准的基本原理—编程语言—C 部分 6.5.4 转换运算符
与 type 类比
char
,由于指针与指针void *
具有相同的表示形式char *
,因此一些编译器将大小void
设为 1,因为它sizeof( *(char *)NULL )
等于 1。但是,根据 C 标准,此类型没有大小,因为它始终不完整的类型 ,因此构造如sizeof( void )
,是不正确的,如果在编译程序时禁用了自己的扩展,编译器应该生成错误消息。所以更准确地说。这是 void 类型的大小。