悬挂指针问题

醉江楼 2015-07-01 09:16:14
int *fun(){
int a[] = {5};

return a;
}

int main(){

int *q;
q = fun();
printf("%d\n",q[0]);

system("pause");
return 0;
}
这段代码中,为啥还能真正确输出5呢,局部数组a不是被销毁了吗,
...全文
145 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
一般编译器会 (1)尽量避免读写内存、磁盘等存储设备以减缓硬件的老化 (2)尽量避免不必要的操作以缩短时间。 所以编译器并没有真正与擦除这些地方的值(这会浪费很多时间)而只是直接改变指针的位置(如果你过汇编的话就很好理解了)。 知道为什么会有数据恢复这些软件吗? 就是因为windows在彻底删除文件时并没有把文件的真正数据写成其他值(不仅会加快硬件老化,而且会浪费大把时间),连文件索引都没擦,只是把文件标记为删了而已。数据恢复软件就是把这些索引通过一定的算法重新恢复出来了。
苏叔叔 2015-07-02
  • 打赏
  • 举报
回复
淋雨不一定会感冒,但我们总是劝人们不要淋雨,对吗?
苏叔叔 2015-07-02
  • 打赏
  • 举报
回复
引用 2 楼 tianshuaiok 的回复:
楼主你好,来听听小老弟给你讲讲吧! 首先,你要搞清楚fun()的返回值代表几层含义。 返回函数指针跟数组的首地址,因为他们是同一个,这下明白了吧。你打印整形,当然是5。
你得再想想?
  • 打赏
  • 举报
回复
其实这里你用vs2013运行的话,编译器会警告你返回临时或局部变量地址。就像他们说的那样,C标准没有定义这种行为,所以编译器即不赞成也不阻止你运行。
幻夢之葉 2015-07-02
  • 打赏
  • 举报
回复
未定义行为 销毁后地址值依然指向该内存 如果这块内存没有被其他程序占用也没有被程序所修改,其值可能是正确的
GKatHere 2015-07-02
  • 打赏
  • 举报
回复

// 不是销毁了, 返回的局部变量的指针是指向栈内的指针,  FUN返回时, 栈指针(esp)会倒退几位, 当再压栈时, 原值会被修改.
// 而此处没有被修改
// 试试
int *fun(){
     int a[] = {5};
     
     return a;
}
int *fun2(){
     int a[] = {6};
     
     return a;
}
int main(){

    int *q;
    q = fun();
 fun2();                         // 将会修改栈内的值
   printf("%d\n",q[0]);    // 6

    system("pause");
    return 0;
}

tianshuaiok 2015-07-01
  • 打赏
  • 举报
回复
楼主你好,来听听小老弟给你讲讲吧! 首先,你要搞清楚fun()的返回值代表几层含义。 返回函数指针跟数组的首地址,因为他们是同一个,这下明白了吧。你打印整形,当然是5。
jiqiang01234 2015-07-01
  • 打赏
  • 举报
回复
输出结果未定义,也就是可能会输出正确的

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧