C99警告是否为无效指针指定了void指针?

时间:2014-10-13 09:40:49

标签: c standards c99 void-pointers

在我的C99标准文件(实际上是2007年9月的自由委员会草案),附件I共同警告2中,它指出

(when) an implicit narrowing conversion is encountered, such as the assignment of a long int or a double to an int, or a pointer to void to a pointer to any type other than a character type (6.3)

是实施可能会产生警告的一些常见情况之一。

那么,c编译器是否可能会向int *p = malloc(sizeof(*p))等代码发出警告?虽然在C代码中似乎更常见的是不投射malloc s。

2 个答案:

答案 0 :(得分:2)

来自C99 Annex I,引用来自:

  

实施可能会在许多情况下产生警告,其中没有一个被指定为本国际标准的一部分。以下是一些较常见的情况。

这里的操作短语是“可能产生”。标准语言非常精确。如果他们想要坚持产生警告,他们就会使用短语“必须生成”或“必须生成”。

如果您的环境是访问无效对齐的数据类型(例如非字边界上的字)会导致灾难性故障(如总线错误),编译器可能会警告您这样的情况。一件事。

答案 1 :(得分:0)

不,在将void*分配给另一个指针时不应该生成警告,因为这正是构造void*的发明。这是一个通用指针,可以转换为任何其他数据指针。这绝不能与整数类型的缩小转换相媲美,在这种情况下,您可能会丢失信息。没有什么可以丢失。

此外,我发现C ++编译器切换到C ++ 11非常烦人,C ++编译器现在已经有了很大的缩小警告业务。至少在C中,非常精确地定义了对无符号整数类型的缩小转换,并且编译器不应该吠叫。