繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM