打印

关于返回值为地址的函数的一些疑惑

[复制链接]
1042|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fmxssh|  楼主 | 2016-3-28 10:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 fmxssh 于 2016-3-28 10:30 编辑

//如下
            int *ad_val()
            {
             static int x;
              int reg_val[3];
              int *p=reg_val;
              x++;
              if(x>65535) x=0;
              *p=x;
              *(p+1)=x+1;
              *(p+2)=x+2;
              return p;
            }
            //在其他函数调用这个函数时,
           // 比如在main()中
           int main()
              {
                    int *p=ad_val();
                     int a[3];
                     while(1)
                     {
                       p=ad_val();
                      a[0]=*p;
                      a[1]=*(p+1);
                      a[2]=*(p+2);
                      }
          在这个main函数中,每次循环一次 数组 a 中每次能得到一个正确的值吗?

相关帖子

沙发
pkuzhx| | 2016-3-28 10:36 | 只看该作者
为什么不能?

使用特权

评论回复
板凳
fmxssh|  楼主 | 2016-3-28 10:46 | 只看该作者

因为 reg_val[3]是个局部数组,当int *ad_val() 这个函数执行完后这个数组的地址空间不是释放了吗?释放的地址可能分配了别的变量,那么他返回的指针p,p+1,p+2 对应的数值还会正确吗?

使用特权

评论回复
地板
pkuzhx| | 2016-3-28 15:14 | 只看该作者
本帖最后由 pkuzhx 于 2016-3-28 15:17 编辑

哦,没仔细看,这种用法确实是错的,局部变量存储在栈中,函数返回后就释放了。即便有时候能够正确输出,也不能这么用。
int *p=ad_val();
        int a[3];

        p=ad_val();
        cout<<"test"<<endl;//注释掉就能正确输出

        a[0]=*p;
        a[1]=*(p+1);
        a[2]=*(p+2);

中间增加任何语句都有可能破坏释放掉的空间的值。本来在cout之前p指向的地址存贮的值是正确的:

但这一块空间是释放掉的,不受保护的,cout函数执行时,改变了这一块的值:

输出就错误了。
即便你保证中间可以不加入任何代码,就立即使用这一块地址的值,但也不能保证后台的其他函数不会改变这一块的值。所以还是乖乖把reg_val也定义成static吧。

使用特权

评论回复
5
fmxssh|  楼主 | 2016-3-30 18:16 | 只看该作者
pkuzhx 发表于 2016-3-28 15:14
哦,没仔细看,这种用法确实是错的,局部变量存储在栈中,函数返回后就释放了。即便有时候能够正确输出,也 ...

谢谢大哥的耐心解答...如果我把  reg_val数组 用static定义为静态局部变量 ,但指向这个数组的指针p还是定义为动态局部变量,那么这个函数(ad_val())在调用结束后,指针变量p所占的内存空间也会被释放,a数组是否还能得到正确的值?

使用特权

评论回复
6
haoyupei| | 2016-4-3 00:24 | 只看该作者
fmxssh 发表于 2016-3-30 18:16
谢谢大哥的耐心解答...如果我把  reg_val数组 用static定义为静态局部变量 ,但指向这个数组的指针p还是 ...

你研究的太深了,但是很明显,函数调用时会创建一个临时变量存储p的数值,被调用函数的局部变量的栈空间全部释放,但是临时变量的数值已经传递到调用函数,反汇编的话应该可以看到这种情况

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

36

帖子

3

粉丝