关于栈清空有关问题
关于栈清空问题
#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函数不需要再调用其他函数就可以清空产生随机值
------解决思路----------------------
当函数执行完了以后,操作系统是要回收栈内存的,这里的回收是指操作系统将这段内存标记为可以,操作系统并不负责将里面的数据清楚,因为这很浪费时间,也没有必要,栈区的内存会被下一个函数的数据覆盖。这就解释了为社么调用了printf函数就会现实随机数的,因为printf函数恰好覆盖了刚才的栈内存。这方面的知识,楼主可以参考《现代操作系统》
------解决思路----------------------
j即使你什么都不干,也可能输出随机数
------解决思路----------------------
“栈清空”这个说法从哪来的?函数返回的时候没人去做“清空”的动作,接下来有别人用就被覆盖,没有别人用就保持原样。
就像从硬盘删除一个文件。如果那块空间没被别的文件覆盖,那就还可以恢复文件;如果被覆盖了就恢复不了。
------解决思路----------------------
楼主这样去输出的话是会输出1-5的,中间调用函数,函数内的局部变量自会把该空间覆盖
另外可以再写一个函数如下:
可以对比两者的值即可推算出funP创建的a数组所在空间的变化情况
#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函数不需要再调用其他函数就可以清空产生随机值
------解决思路----------------------
当函数执行完了以后,操作系统是要回收栈内存的,这里的回收是指操作系统将这段内存标记为可以,操作系统并不负责将里面的数据清楚,因为这很浪费时间,也没有必要,栈区的内存会被下一个函数的数据覆盖。这就解释了为社么调用了printf函数就会现实随机数的,因为printf函数恰好覆盖了刚才的栈内存。这方面的知识,楼主可以参考《现代操作系统》
------解决思路----------------------
j即使你什么都不干,也可能输出随机数
------解决思路----------------------
“栈清空”这个说法从哪来的?函数返回的时候没人去做“清空”的动作,接下来有别人用就被覆盖,没有别人用就保持原样。
就像从硬盘删除一个文件。如果那块空间没被别的文件覆盖,那就还可以恢复文件;如果被覆盖了就恢复不了。
------解决思路----------------------
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数组所在空间的变化情况