[英]Manipulate a local static pointer variable outside the function where it is defined
我想访问并修改全局范围内函数中定义的静态变量,但输出的第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
欢迎任何评论。
运作顺序。 两次,你执行*ox++;
。
这不被评估为(*ox)++
“递增指向值” 。
它是*(ox++)
“递增指针” 。
为什么牛是0?
巧合的是, ox
正指向0
。 您已将其递增以指向您不拥有的内存。
你遇到了一些解析问题。 让我们逐行查看代码:
static int * x = new int(5);
第一次控制流经过该行时, x
被赋予一个指向新分配的int
的指针,该int
用值5初始化。每个后续时间控制流经过,该行将被“跳过”。 到目前为止没有惊喜。
cout << *x << '\t' << &x << endl;
我怀疑你打算打印值的地址,而不是指针,因此输入
cout << *x << '\t' << x << endl;
现在变得有趣了。 这条线可能不会像你想象的那样做。
*x++;
编译器将其解析为*(x++)
。 发生的事情是指针x
被提前并且其先前的值被解除引用并且该结果被丢弃。 (在下次输入函数时调用未定义的行为,因为现在x
指向一个超过分配的内存位置。)您可能假设它被解析为(*x)++
,这会增加x指向的值。
相同的模式适用于您的main
。
如果我用GCC编译你的原始代码并传递-Wall
标志(这总是一个好主意),它给了我们一个很好的暗示:
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++;
^
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.