我正在为一个地址0x0000有效且包含端口 I/O 的系统编写 C 代码。因此,任何访问 NULL 指针的可能错误都不会被检测到,同时会导致危险的行为。
因此,我希望将 NULL 重新定义为另一个地址,例如一个无效的地址。如果我不小心访问这样一个地址,我会得到一个硬件中断,我可以处理错误。我碰巧可以访问这个编译器的 stddef.h,所以我实际上可以修改标准头文件并重新定义 NULL。
我的问题是: 这会与 C 标准冲突吗?从标准的7.17中我可以看出,宏是实现定义的。标准中是否有其他内容说明 NULL 必须的为0?
另一个问题是,许多编译器执行静态初始化时,无论数据类型如何,都将所有内容设置为零。尽管标准规定编译器应该将整数设置为零并指向 NULL。如果我要为我的编译器重新定义 NULL,那么我知道这样的静态初始化将会失败。我可以认为这是不正确的编译器行为,即使我大胆地改变了手动编译器标题?因为我确信这个特定的编译器在进行静态初始化时不会访问 NULL 宏。