在定义它的函数之外操作本地静态指针变量

时间:2015-01-20 04:06:19

标签: c++ function variables pointers static

我想访问并修改全局范围内函数中定义的静态变量,但输出的第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

欢迎任何评论。

2 个答案:

答案 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}}