主题:[原创][讨论]尝试解释一个大家都觉得疑惑的问题
定义一个函数,在函数内部申请一块内存空间(通过malloc函数(C++中对应为new))并对其进行赋值,然后通过指针返回内存块首地址(此指针变量是函数局部的),结果往往是主调函数能正常使用被调函数申请、赋值的空间,正是这一点,使大家百思不得其解,因为它似乎违背了“函数调用结束,内部申明的自动变量亦释放”。
解释之前弄懂几句术语:
对内存分配上的“栈 stack”和“堆 heap”简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。stack一般是静态分配内存,heap上一般是动态分配内存。
由malloc系统函数分配的内存就是从堆上分配内存。从堆上分配的内存一定要自己释放。用free释放,不然就是“内存泄露”--像函数fun1那样;而fun1函数中定义的数组是栈内存分配,函数结束后系统自动收回内存区域,所以我们看到的输出是不可预料的。(所以 大家一定要注意malloc和free成对使用(C++中对应为new和delete))
表达能力及专业知识不够强、可能解释不够准确,大家发表发表下自己的看法。
/*例程*/
#include <stdio.h>
#include <malloc.h>
int *fun1(int); /*fun1通过malloc函数申请内存 返回首地址*/
int *fun2(void);/*fun2通过定义数组申请内存 返回首地址*/
void main()
{
int i, n=10, *p;
p=fun1(n);
for(i=0;i<n;i++)
printf("%d ",p[i]);/*输出结果为1 2 3 4 5 6 7 8 9 10*/
p=fun2();
for(i=0;i<n;i++)
printf("%d ",p[i]);/*输出结果不可预料*/
}
int *fun1(int size)/*堆内存分配*/
{
int i, *po;
po=(int*)(malloc(sizeof(int)*size));
for(i=0;i<size;i++)
po[i]=i+1;
return po;
}
int *fun2()/*栈内存分配*/
{
int *po=NULL,a[]={1,2,3,4,5,6,7,8,9,10};
po=a;
return po;
}