鱼C论坛

 找回密码
 立即注册
查看: 5456|回复: 16

麻烦各位看一下这个题目

[复制链接]
发表于 2013-8-15 15:58:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
因为有些书上写的函数体内定义的数组是存储在栈中的,当函数介绍后就被释放,这时返回会出错但是这个代码输出结果是110、1245056、4241493. 我的问题就是如果栈内的数据释放了,那么第一个值也应该是乱码,为什么第一个数返回时正确的。谢谢各位了。

#include <stdio.h>
int *a();
int main()
{
    int *b = NULL;
    b = a();
    int i = 0;
    for(i = 0;i < 3;i++)
    {
        printf("%d\n",*b++ );
    }

    return 0;
}
int *a()
{
    int a[3] = {110,11,123};
    return a;
}


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-15 16:28:02 | 显示全部楼层
shihu " printf("%d\n",*b++ ); "youwenti
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-15 17:43:06 | 显示全部楼层
我估计是这样的,开始110,11,123入栈,返回的是指向110的指针,现在也就是B,这时候要栈向下,但是数据还在啊,就是110,11,123并没有消失,只是ESP往下走了(增大了),,,这时候你调用printf,从右向左压入两个参数,一个是变量,另一个是%d\n,,,这时候,只是11被%d\n这货覆盖了,110,没变你开始printf了,必须出110啊,,,,,,然后看下一次printf,这时候b++,已经指向%d\n,所以估计1245056就是%d\n,,,然后呢,把123覆盖了,就输出了,,,我说的其实真的狠清楚了,你可以画个图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-15 17:44:31 | 显示全部楼层
你反汇编一下,,,立马估计就出来了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-15 17:47:33 | 显示全部楼层
原值是一种特殊的乱码,释放空间不一定非要把原先的值清除掉,只要标记该位置为“未使用”就可以了。要让它编程其它值,可以像以下程序这样加一句函数调用。
  1. #include <stdio.h>
  2. int *a();
  3. int main()
  4. {
  5.      int *b = NULL;
  6.      
  7.      int i = 0;
  8.          b = a();
  9.          //add this
  10.          puts("add me");
  11.      for(i = 0;i < 3;i++)
  12.      {
  13.          printf("%d\n",*b++ );
  14.      }

  15.     return 0;
  16. }
  17. int *a()
  18. {
  19.      int a[3] = {110,11,123};
  20.      return a;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-15 17:57:04 | 显示全部楼层
。。。我再说的清楚点,几次栈的构成,,,开始110,11,123,,,第一次后110,%d\n,123,,,第二次110,%d\n,%d\n,,,第三次,110,%d\n,%d\n,%d\n     至于为什么1245056 和 4241493不一样,估计是覆盖的时候可能怎么了,不过我觉得理解到这就ok了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-15 18:09:03 | 显示全部楼层
不是每一次都正确的,因为那段内存刚好没有被占用。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-15 18:56:58 | 显示全部楼层

感谢您,感谢您,我在自己理解一下了谢谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-15 18:57:32 | 显示全部楼层
WickedBinary 发表于 2013-8-15 16:28
shihu " printf("%d\n",*b++ ); "youwenti

谢谢您可能楼下的解释更好一些,谢谢您了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-15 18:58:24 | 显示全部楼层
仰望天上的光 发表于 2013-8-15 17:47
原值是一种特殊的乱码,释放空间不一定非要把原先的值清除掉,只要标记该位置为“未使用”就可以了。要让它 ...

谢谢您,您添加的这条语句给我新的思路,我在自己考虑一下,谢谢您了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-15 19:21:42 | 显示全部楼层
仰望天上的光 发表于 2013-8-15 17:47
原值是一种特殊的乱码,释放空间不一定非要把原先的值清除掉,只要标记该位置为“未使用”就可以了。要让它 ...

还有一个问题,就是如果在本程序中创建的数组是存储在站内的,如果我要返回单个数组值就是正确的像如下的代码,这又是为什么呢,难道返回的时候没有释放值吗
#include <stdio.h>
int a();
int main()
{
        int b = 0;
    int i = 0;
    b = a();
    printf("%d\n",b );
    return 0;
}
int a()
{
     int a[3] = {12130,11,123};
     return a[0];
}
谢谢各位了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-15 21:20:06 | 显示全部楼层
bbyuner0220 发表于 2013-8-15 19:21
还有一个问题,就是如果在本程序中创建的数组是存储在站内的,如果我要返回单个数组值就是正确的像如下的 ...

单个值返回的时候和函数参数一样,是值拷贝。就是说在函数堆栈内的变量消亡之前,将它的值拷贝出来。而数组会自动退化为指针,所以返回一个数组其实是返回指向该数组首元素的指针。同样也是值传递,但这次仅仅返回了该指针的值,而不是把数组整体作为一个值返回。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-16 11:52:22 | 显示全部楼层
这个建议楼主看下反汇编,并理解下栈机制!仰望天上的光 版主已经解释过了。楼主好好理解下栈机制就可以了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-19 10:53:27 | 显示全部楼层
编程难 发表于 2013-8-16 11:52
这个建议楼主看下反汇编,并理解下栈机制!仰望天上的光 版主已经解释过了。楼主好好理解下栈机制就可以了。 ...

好的,谢谢您了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-19 10:54:07 | 显示全部楼层
仰望天上的光 发表于 2013-8-15 21:20
单个值返回的时候和函数参数一样,是值拷贝。就是说在函数堆栈内的变量消亡之前,将它的值拷贝出来。而数 ...

谢谢你了,明白了,谢谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-28 14:03:30 | 显示全部楼层
学习了学习了~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-28 16:21:49 | 显示全部楼层
高手解答就是不一样,受教了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-18 01:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表