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

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)++"increment the pointed-to value".

*(ox++)"increment the pointer".

why ox is 0?

ox 恰好指向 0。您已将其递增以指向您不拥有的内存。

您遇到了一些解析问题。让我们逐行看代码:

static int * x = new int(5);

第一次控制流通过这条线时,x 被分配一个指向新分配的 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++;
        ^