【发布时间】:2012-12-21 21:01:36
【问题描述】:
给定以下代码:
char buffer[1024];
char * const begin = buffer;
char * const end = buffer + 1024;
char *p = begin + 2000;
if (p < begin || p > end)
std::cout << "pointer is out of range\n";
执行的比较(p < begin 和p > end)是否定义明确?或者这段代码是否有未定义的行为,因为指针已经超过了数组的末尾?
如果比较定义明确,那么定义是什么?
(额外的功劳:begin + 2000 本身的评估是未定义的行为吗?)
【问题讨论】:
-
我认为答案只是指针越过末尾和NULL,但我不能引用章节。
-
在具有分段内存的系统上,地址
begin + 2000可能不存在。 -
本题有两个不同的概念:指针的比较和指针值的创建。在询问指针比较之前,我们必须确定
begin + 2000是否定义明确。我不认为它是。但是,一旦我们有了两个有效的指针,您就可以询问如何比较它们。正如 Mat 的回答所指出的,一般没有具体说明。但是,您可以使用std::less<>(等人)来获得指针值的总排序,即使未指定直接使用<。
标签: c++ language-lawyer