加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:56:06 所属栏目:百科 来源:网络整理
导读:我想访问并修改全局范围内函数中定义的静态变量,但输出的第2行和第3行是意外的,为什么ox为0? #include iostreamusing namespace std;int * foo(){ static int *x = new int(5); cout *x 't' x endl; *x++; return x;}int main(){ int * ox; ox = foo(); co
我想访问并修改全局范围内函数中定义的静态变量,但输出的第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

欢迎任何评论.

解决方法

你遇到了一些解析问题.让我们逐行查看代码:

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指向的值.

相同的模式适用于您的主要.

如果我用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++;
        ^

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读