在C中:void *是类型吗?

时间:2019-03-20 19:09:51

标签: c pointers

在一些讨论中,它声称void *是“指向void对象的指针”,但是在C标准6.5.3.4中,第2点写为: “ sizeof运算符产生的大小(以字节为单位)。...大小由操作数的类型确定。” 因此可以说函数sizeof()接收类型作为参数。

因此,编译器将void *视为类型?或*的使用仅用于语义解释?

2 个答案:

答案 0 :(得分:5)

void *是具有已知大小的有效类型。它指向的对象是类型未知的对象或有效的未类型化内存(即从malloc返回的内存)。因此sizeof(void *)是有效的表达式。

6.5.3.4的第1段规定:

  

sizeof运算符不得应用于具有以下内容的表达式   函数类型或不完整类型,带括号的名称   ”或指定一个   位域成员。的   _Alignof运算符不得应用于函数类型或不完整类型。

由于void *不是不完整的类型,因此sizeof(void *)是有效的。但是,由于void类型不完整,因此sizeof(void)无效。

解决您对void **的评论,这也是指向类型void *的对象的有效类型。

某些编译器(例如GCC)实现了void大小为1的扩展,因此sizeof(void) == 1void *上的指针算术以与{{ 1}}。但是,这违反了标准。

答案 1 :(得分:4)

void *确实是一种类型。 void也是如此。

void是无法完成的不完整类型-它代表一组空值。因为它是不完整的类型,所以它可能不是sizeof运算符的操作数。因此,void(在逻辑上)没有大小,因此您无法创建void类型的对象。

void *是指针类型,因此是完整类型。它充当“通用”指针类型,并且无需转换即可转换为其他指针类型。您不能取消引用void *,因为结果的类型为void,并且不能有类型为void的对象-必须首先将其转换为指向完整类型的指针。

void *具有与char *相同的大小和表示形式。