关于栈清空问题

隐无影 2014-10-04 03:17:32
#include<stdlib.h>
#include<stdio.h>
int *go()//返回指向变量地址
{
int a = 10; //a在栈上
int *p = &a; //输出地址
return p;
}
int *goN()//返回数组的首地址
{
int a[5] = { 1, 2, 3, 4, 5 };

printf("%x", a);
int *p = a;
return p;
}
int main()
{
int *px = goN();//获取返回值指针
// 这里不需要再调用函数,直接输出随机值
for (int i = 0; i < 5; i++)
{
printf("%d", *(px + i));
}







system("pause");
return 0;
}
int main1()//这是为了区别
{
int *px = go();///获取指针//我知道调用函数就会栈清空,这里不是已经调用了go函数吗,怎么没清空,还要调用printf才清空
printf("\n"); ////如果不加这个,这个值输出正常,但加了这个就产生随机数,这是为毛
printf("%d", *px);








system("pause");
return 0;
}
开始调用go函数返回一个地址保存到指针如果直接输出就值是正常的,不会产生随机数,要再调用一个函数,才产生随机数
,如果调用goN函数不需要再调用其他函数就可以清空产生随机值
...全文
382 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
codings手艺人 2014-10-10
  • 打赏
  • 举报
回复
因为整形变量在函数中返回的,是变量的值,他与指针返回的地址是不同的。
常书 2014-10-06
  • 打赏
  • 举报
回复

int main()
{
    int testa[5] = {0};
    int i = 0;
    int *px = goN();//获取返回值指针
    // 这里不需要再调用函数,直接输出随机值

    for (i=0; i<5; i++)
    {
        testa[i] = px[i];
    }
    printf("\n");
    for (i = 0; i < 5; i++)
    {
        printf("%d", testa[i]);
    }
    printf("\n");
    return 0;
}
楼主这样去输出的话是会输出1-5的,中间调用函数,函数内的局部变量自会把该空间覆盖 另外可以再写一个函数如下:

void fun(void)
{
    int c[5] = {5,4,3,2,1};

    printf("fun:%x\n", (unsigned int)c);
}
可以对比两者的值即可推算出funP创建的a数组所在空间的变化情况
brookmill 2014-10-05
  • 打赏
  • 举报
回复
“栈清空”这个说法从哪来的?函数返回的时候没人去做“清空”的动作,接下来有别人用就被覆盖,没有别人用就保持原样。 就像从硬盘删除一个文件。如果那块空间没被别的文件覆盖,那就还可以恢复文件;如果被覆盖了就恢复不了。
隐无影 2014-10-05
  • 打赏
  • 举报
回复
引用 4 楼 u013163178 的回复:
[quote=引用 3 楼 u011391093 的回复:] [quote=引用 2 楼 u013163178 的回复:] 当函数执行完了以后,操作系统是要回收栈内存的,这里的回收是指操作系统将这段内存标记为可以,操作系统并不负责将里面的数据清楚,因为这很浪费时间,也没有必要,栈区的内存会被下一个函数的数据覆盖。这就解释了为社么调用了printf函数就会现实随机数的,因为printf函数恰好覆盖了刚才的栈内存。这方面的知识,楼主可以参考《现代操作系统》
为毛传递数组,不需要printf函数覆盖,直接输出随机数,[/quote]j即使你什么都不干,也可能输出随机数[/quote]我想应该是这样,被下一个函数覆盖有可能刚刚好,没覆盖a的变量是个随机性,而数组有5个元素其中覆盖的几率很大,我刚刚看视频教程发现了,老师用查看内存,数组有时前2个没被,覆盖,我想是不是这样
隐无影 2014-10-05
  • 打赏
  • 举报
回复
引用 5 楼 qq_16979311 的回复:
局部变量在函数结束后,刚创建的栈就被回收了,所以局部变量的地址是不能返回的。
问题是整型变量正常输出,这里想不通哇
codings手艺人 2014-10-05
  • 打赏
  • 举报
回复
局部变量在函数结束后,刚创建的栈就被回收了,所以局部变量的地址是不能返回的。
li4c 2014-10-05
  • 打赏
  • 举报
回复
引用 3 楼 u011391093 的回复:
[quote=引用 2 楼 u013163178 的回复:] 当函数执行完了以后,操作系统是要回收栈内存的,这里的回收是指操作系统将这段内存标记为可以,操作系统并不负责将里面的数据清楚,因为这很浪费时间,也没有必要,栈区的内存会被下一个函数的数据覆盖。这就解释了为社么调用了printf函数就会现实随机数的,因为printf函数恰好覆盖了刚才的栈内存。这方面的知识,楼主可以参考《现代操作系统》
为毛传递数组,不需要printf函数覆盖,直接输出随机数,[/quote]j即使你什么都不干,也可能输出随机数
隐无影 2014-10-04
  • 打赏
  • 举报
回复
引用 2 楼 u013163178 的回复:
当函数执行完了以后,操作系统是要回收栈内存的,这里的回收是指操作系统将这段内存标记为可以,操作系统并不负责将里面的数据清楚,因为这很浪费时间,也没有必要,栈区的内存会被下一个函数的数据覆盖。这就解释了为社么调用了printf函数就会现实随机数的,因为printf函数恰好覆盖了刚才的栈内存。这方面的知识,楼主可以参考《现代操作系统》
为毛传递数组,不需要printf函数覆盖,直接输出随机数,
li4c 2014-10-04
  • 打赏
  • 举报
回复
当函数执行完了以后,操作系统是要回收栈内存的,这里的回收是指操作系统将这段内存标记为可以,操作系统并不负责将里面的数据清楚,因为这很浪费时间,也没有必要,栈区的内存会被下一个函数的数据覆盖。这就解释了为社么调用了printf函数就会现实随机数的,因为printf函数恰好覆盖了刚才的栈内存。这方面的知识,楼主可以参考《现代操作系统》

69,369

社区成员

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

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