在 C 中使用无效的指针值合法吗?
Posted
技术标签:
【中文标题】在 C 中使用无效的指针值合法吗?【英文标题】:Is using an invalid pointer value legal in C? 【发布时间】:2010-11-02 09:59:38 【问题描述】:以下代码是undefined behavior in C++(尽管它几乎可以在任何广泛使用的实现中正常工作):
int* pointer; //uninitialized - likely illegal pointer value
pointer++; //incrementing an illegal pointer is UB
上面的代码在C语言中合法吗?
【问题讨论】:
顺便说一句,合法与否,你希望用它实现什么 - 我的意思是,如果它合法,是否有任何有效的用例? @Amarghosh:简单——例如,您编写一个调用free()
的内存管理器,然后打印“释放地址X 的块”。在该指针上调用free()
后将指针值传递给printf()
结果是UB。
大概你可以在 C99 中避免这种情况,而不会导致未定义的行为,方法是在调用 free()
之前将指针地址复制到 intptr_t
,然后在调用 intptr_t
之后将 printf
实际指针被释放。
@Charles Salvia:是的,就是这样做的。
【参考方案1】:
这也是 C 中未定义的行为,因为在某些架构上,将无效指针加载到寄存器中会触发硬件故障。
见Is storing an invalid pointer automatically undefined behavior?
【讨论】:
这太疯狂了!该死的标准,我想我永远不会遵守它。那么请告诉我,如果我有一个由指针和整数组成的union
怎么办?
接下来你会说如果字符不可读,char
类型的值将触发硬件故障!
顺便说一句,存在很多迭代数组的算法,而它们实际上在检查循环中断条件之前增加元素指针之前。也就是说,它们增加指针,但不一定取消引用它。你是说这是一个潜在的崩溃?
@valdo:这也是未定义的,它在实践中是否有效完全取决于整数的类型以及它是否可以保存指针的位。但是当intptr_t
存在时,绝对没有理由使用联合来获取指针的整数值。
我喜欢认为指针是一个整数,只要你实际上没有取消引用它。而且我不在乎标准实际上是怎么说的,请原谅我 Kernigan & Richie。【参考方案2】:
这是 C99 中未定义的行为。 pointer
的值是“不确定的”(6.7.8.10),不确定的值可能是一个陷阱值,使用时会导致不确定性。
【讨论】:
【参考方案3】:不合法。像这样的代码将编译,但有警告。不要忽视他们。不要写这样的代码。它会以许多不太好的方式影响您的系统。我的大学老师曾经告诉我们,他设法使用具有未定义行为的代码擦除了一台机器的 Bios。
【讨论】:
以上是关于在 C 中使用无效的指针值合法吗?的主要内容,如果未能解决你的问题,请参考以下文章
不评估应用了 sizeof 的表达式是不是使得在 C++ 中取消引用 sizeof 内的空指针或无效指针是合法的?