关于在子函数中空间的分配问题(c语言)

donghaish 2006-04-10 08:35:59
我们知道,在子函数里定义的变量,所申请的空间当函数结束时自动撤销。
那么,假如我写这么一段程序:
int *fun(int x)
{
int *s;
s=(int*)malloc(2*sizeof(int));
s[0]=x;s[1]=x+1;
return s;
}
int main()
{
int *a;
a=fun(2);
printf("%d,%d",*a,*(a+1));
return 0;
}
那么在main()中,调用的fun(2)返回给a以s的地址,那么之后因fun结束,s的空间被撤销,是不是将产生错误。好像c语言的程序一些变量等都放在堆里,那么程序结束他们在堆里所占用的空间不释放吗?
不知道表达清楚了没:)
...全文
487 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
donghaish 2006-04-11
  • 打赏
  • 举报
回复
hoho,谢了:)
du51 2006-04-11
  • 打赏
  • 举报
回复
如果子程序里有动态分配,这样写是可以的吧。

可以.

TC有些时候是这样.甚至有的语法讲不通也能过....竟然还能运行...
donghaish 2006-04-11
  • 打赏
  • 举报
回复
int *fun(int x)
{
int s[2];
s[0]=x;s[1]=x+1;
return s;
}
int main()
{
int *a;
a=fun(2);
printf("%d,%d",*a,*(a+1));
getch();
return 0;
}
这样的代码在tc下竟然没有warninig:(
donghaish 2006-04-11
  • 打赏
  • 举报
回复
如果子程序里有动态分配,这样写是可以的吧。
不好意思,有点唠叨,不过确实想确定一下:)
int *fun(int x)
{
int *s;
s=(int*)malloc(2*sizeof(int));
s[0]=x;s[1]=x+1;
return s;
}
int main()
{
int *a;
a=fun(2);
printf("%d,%d",*a,*(a+1));
return 0;
}
du51 2006-04-11
  • 打赏
  • 举报
回复
也就是说以下写法是很不安全的了?

这种写法,一般的编译器都会WARNING....
不是不安全...本身就是错的.
donghaish 2006-04-11
  • 打赏
  • 举报
回复
也就是说以下写法是很不安全的了?
int *fun(int x)
{
int s[2];
s[0]=x;s[1]=x+1;
return s;
}
int main()
{
int *a;
a=fun(2);
printf("%d,%d",*a,*(a+1));
getch();
return 0;
}
du51 2006-04-11
  • 打赏
  • 举报
回复
申请空间,是告诉操作系统,这片地我要了.别人不能用.
释放的时候,是告诉操作系统,这片地我不要了.别人可以用.

但是,在别人没用之前,,那片地还是你种的粮食.

而不是你想的那样要把那片地从地球上弄走,或是完全把它铲平....
ouyh12345 2006-04-11
  • 打赏
  • 举报
回复
你的理解不对。
栈的空间被释放时,并不会用什么东西来填充它。
也就是说,在释放后访问它,其行为是未定义的。
du51 2006-04-11
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
int n=10,i;
int *p=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
p[i]=i;
printf("释放前:\n");
for(i=0;i<n;i++)printf("%d ",p[i]);
printf("\n");
free(p);/*此处释放*/
printf("释放后:\n");
for(i=0;i<n;i++)printf("%d ",p[i]);
printf("\n");
getch();
return 0;
}
donghaish 2006-04-11
  • 打赏
  • 举报
回复
to du51(郁郁思扬):
对于1我已经知道,前面我已写过。
对2,我是这么想的:s是fun的局部变量,它应该被存放在和fun一起开辟的栈中,随着fun的结束而撤销,我们都知道栈的运行方式的(大体应该和数据结构的栈类似吧)。存储空间被释放就算你引用也不会可能得到2,3,而只是些乱七八糟的值。

不知道我的理解对不对:)
du51 2006-04-11
  • 打赏
  • 举报
回复
1.malloc分配在堆中,不会消失,除非你自己free它.或者重启系统.
2.
我运行程序后,得到2,3。这又是为什么?按道理s[]应该是放在栈中,随着子程序的撤销而释放的。
----------------------------------
内存是取不空的.并不是你取之后,那块内存就什么也没有了.只是读出而已.
为什么还是输出2,3.
很简单,那块内存区还没有被覆盖.你实际上是越界访问..
donghaish 2006-04-11
  • 打赏
  • 举报
回复
我运行程序后,得到2,3。这又是为什么?按道理s[]应该是放在栈中,随着子程序的撤销而释放的。
donghaish 2006-04-11
  • 打赏
  • 举报
回复
我昨晚看了关于动态分配的问题,动态分配本身就是为解决这样的问题:有些东西我分配空间后就想一直保持住,一直到我主动释放为止。
那如果我把程序改成:
int *fun(int x)
{
int s[2];
s[0]=x;s[1]=x+1;
return s;
}
int main()
{
int *a;
a=fun(2);
printf("%d,%d",*a,*(a+1));
getch();
return 0;
}
也就是在子程序中不用malloc动态分配,而直接定义一个数组,那结果会是什么?
duduhaha 2006-04-10
  • 打赏
  • 举报
回复
malloc是在堆中分配空间的,生存周期持续到整个程序结束或free释放掉为止.
楼主去看看栈,堆,还有生存周期这些概念.
donghaish 2006-04-10
  • 打赏
  • 举报
回复
自己顶一下:)
donghaish 2006-04-10
  • 打赏
  • 举报
回复
hoho :)
hotee 2006-04-10
  • 打赏
  • 举报
回复
我想也是,s的空间被撤销,可是他的地址已经赋予了a
难道。。
donghaish 2006-04-10
  • 打赏
  • 举报
回复
我想知道在c编译器中大体是怎么处理这个过程的(函数返回值)
donghaish 2006-04-10
  • 打赏
  • 举报
回复
to lilo_x(lilo):
放栈里那程序结束后是不也弹栈撤销吧
lilo_x 2006-04-10
  • 打赏
  • 举报
回复
子程序的变量好象是放在栈里.

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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