【发布时间】:2013-09-28 16:55:31
【问题描述】:
我意识到,如果我将 const int 定义到 c++ 函数的主体中,然后使用地址算术来更改常量的值(它在堆栈上,不是吗?)。我得到了这个代码:
const int a = 10;
int b = 100;
int * c = &b;
c++;
cout << "&a: " << &a << endl;
cout << " c: " << c << endl;
*c = 100500;
cout << " a: " << a << endl;
cout << "*c: " << *c << endl;
我得到了这个输出
&a: 0x7ffff63866a8
c: 0x7ffff63866a8
a: 10
*c: 100500
因此,地址相同,但值不同。有人可以解释一下这个结果吗?谢谢! p.s.我试过 GCC、Clang 和 VS
【问题讨论】:
-
无论如何改变 const 是标准中未定义的行为。
-
你刚刚调用了未定义的行为。
-
c后增量的值不是定义的行为,既不是值也不是解引用。如果b是一个数组(甚至是一个数组),值将被定义,但取消引用仍然不是(在单长的情况下)。 -
@OliCharlesworth 不是。大约一年前,当我提议使用
&c和&c+1作为边界时,我建议通过迭代器所需的参数列表发送一个单例(实际上......我使用了与OP 相同的指针)这里)。我必须把它掸掉才能找到它,但最终标准被引用为 last+one 仅对数组类型有效。正如你想象的那样,我很惊讶。 -
@OliCharlesworth ...但我会继续挖掘。由于我在炮击后放弃了原始问题的答案,因此我只能通过评论找到它,我们知道 那 是多么快乐。
标签: c++ constants point-of-interest