我想访问并修改全局范围内函数中定义的静态变量,但输出的第2行和第3行是意外的,为什么ox为0?
#include <iostream>
using namespace std;
int * foo(){
static int *x = new int(5);
cout << *x << '\t' << &x << endl;
*x++;
return x;
}
int main(){
int * ox;
ox = foo();
cout << *ox << '\t' << &ox << endl;
*ox++;
cout << *ox << '\t' << &ox << endl;
int * t= foo();
}
输出是(在我的机器上):
5 0x6021d0
0 0x7fffdc82d3a0
0 0x7fffdc82d3a0
0 0x6021d0
欢迎任何评论。
答案 0 :(得分:4)
操作顺序。两次,你执行*ox++;
。
这是不评估为(*ox)++
“增加指向值”。
*(ox++)
“递增指针”。
巧合地,为什么牛是0?
ox
指向0
。您已将其递增以指向您不拥有的内存。
答案 1 :(得分:3)
你遇到了一些解析问题。让我们逐行查看代码:
static int * x = new int(5);
第一次控制流经过这一行时,x
被赋予一个指向新分配的int
的指针,该cout << *x << '\t' << &x << endl;
初始化为值5.每个后续时间控制流经过,该行将是“跳过”。到目前为止没有惊喜。
cout << *x << '\t' << x << endl;
我怀疑你打算打印值的地址,而不是指针,因此键入
*x++;
现在变得有趣了。这条线可能不符合你的想法。
*(x++)
编译器将其解析为x
。发生的事情是指针x
被提前并且其先前的值被解除引用并且该结果被丢弃。 (在下次输入函数时会调用未定义的行为,因为现在(*x)++
指向一个超出分配的内存位置。)您可能假设它被解析为main
,这会增加指向的值 - 通过x。
相同的模式适用于您的-Wall
。
如果我使用GCC编译原始代码并传递main.cpp: In function ‘int* foo()’:
main.cpp:8:7: warning: value computed is not used [-Wunused-value]
*x++;
^
main.cpp: In function ‘int main()’:
main.cpp:16:8: warning: value computed is not used [-Wunused-value]
*ox++;
^
标志(这总是一个好主意),它会给我们一个很好的提示:
{{1}}