【发布时间】:2012-02-25 05:52:39
【问题描述】:
一些 C 或 C++ 程序员甚至会惊讶地发现 storing an invalid pointer is undefined behavior。但是,对于堆或堆栈数组,可以将地址存储在数组末尾之后,这样您就可以存储“结束”位置以供循环使用。
但是从单个堆栈变量形成指针范围是未定义的行为,例如:
char c = 'X';
char* begin = &c;
char* end = begin + 1;
for (; begin != end; ++begin) { /* do something */ }
虽然上面的例子没什么用,但在某些函数需要一个指针范围的情况下,这可能很有用,而你只是有一个简单的值来传递它。
这是未定义的行为吗?
【问题讨论】:
-
你确定你的措辞是正确的,存储无效指针的地址是未定义的行为吗?
int* ptr; int** ptr2 = &ptr正在存储无效指针的地址。是UB吗?如果你的意思是我们不能让指针指向无效内存,那么我们如何拥有指向NULL的指针? -
@SethCarnegie:
int* ptr; int* ptr2 = &ptr甚至无法编译,因为ptr2的类型不匹配。此外,nullptr是一个特例。 -
@Seth,NULL 是标准保留的特殊值。
-
Channel72 只回答了我的一个问题。 @Mankarse 已修复
标签: c++ c pointers undefined-behavior language-lawyer