鱼C论坛

 找回密码
 立即注册
查看: 1003|回复: 5

[已解决]关于自动存储期,不懂的地方。

[复制链接]
发表于 2020-5-12 23:17:47 | 显示全部楼层 |阅读模式

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

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

x
在函数中定义的变量,默认是自动变量,具有自动存储期,在函数结束的时候会释放相应的空间。那为什么下面这个代码可以输出p所指向的函数中变量s的值???小白求教。在此先感谢大佬讲解。
#include<stdio.h>
int *add(int a,int b)
{
int s;
s=a+b;
return &s;
}
int main(void)
{
int a=1,b=2;
int *p;
p=add(a,b);
printf("%d\n",*p);
}
最佳答案
2020-5-12 23:51:00
1. 你的程序有bug,add 函数不应该返回临时变量的地址。
2. 第一次听说自动存储期。
3. 一般情况下,编写程序,只需要考虑,堆和栈即可。堆空间为进程共享,栈空间为函数独享。地址空间段不同,增长方向也不同。栈空间在函数结束时自动释放,即所有的变量都会被还给操作系统。堆变量需要程序员手工释放,当然了,进程结束时,仍然会被回收。所以,你的 add 函数返回了 栈空间的地址,是一个bug,在某些编译器可以工作,在某些提示为 warning,在某些提示为 error。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-12 23:51:00 | 显示全部楼层    本楼为最佳答案   
1. 你的程序有bug,add 函数不应该返回临时变量的地址。
2. 第一次听说自动存储期。
3. 一般情况下,编写程序,只需要考虑,堆和栈即可。堆空间为进程共享,栈空间为函数独享。地址空间段不同,增长方向也不同。栈空间在函数结束时自动释放,即所有的变量都会被还给操作系统。堆变量需要程序员手工释放,当然了,进程结束时,仍然会被回收。所以,你的 add 函数返回了 栈空间的地址,是一个bug,在某些编译器可以工作,在某些提示为 warning,在某些提示为 error。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 08:28:03 | 显示全部楼层
赚小钱 发表于 2020-5-12 23:51
1. 你的程序有bug,add 函数不应该返回临时变量的地址。
2. 第一次听说自动存储期。
3. 一般情况下,编写 ...

2.没声明 static……什么的都是自动存储期
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 09:31:38 | 显示全部楼层
自动存储期应该是翻译不同,其实说的是 auto声明的自动变量,在函数中没有被声明为其他类型的变量默认都是自动变量,因此auto算是C语言中应用最广泛的一种类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 11:22:44 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-13 08:28
2.没声明 static……什么的都是自动存储期

感谢,我去查一下资料。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 11:30:42 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-14 01:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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