是否通过C99标准成功编译*(NULL)?

Dav*_*tti 1 c c99

我理解这个代码永远不应该被执行但是*(NULL)通过C99标准成功编译了吗?

#include <stdio.h>
int main(void) {
    *(NULL);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

PS:在ideone上运行它返回0但我不知道正在使用的编译器版本:(

R..*_*R.. 5

如果NULL被定义为简单0(允许),那么*(0)是违反约束并且必须被诊断.如果NULL定义为((void *)0)然后*((void *)0)调用未定义的行为(通过解除引用空指针)并且编译器不需要发出任何诊断,但程序也不需要按照您期望的方式运行.

  • 我的印象是,无论指针值是否有效,取消引用`void*`指针在C中始终是非法的.这意味着即使对于`NULL'的`(void*)0`定义,代码也包含约束违规.虽然......标准没有明确说明 (2认同)