c语言中这几个概念还是很重要的,我们平时malloc函数申请到的就在堆区,是动态存储区;栈中申请到的内存在程序结束后就会自动销毁,静态数据存储区的空间是不能销毁的。
下面通过一个例子来说明:
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
char *test(void)
{
char a[14] = "hello world";
char *q =(char *) malloc(sizeof(8));
if(null == q)
{
puts("memory malloc error");
return null;
}
free(q);
char *p2 = "abdce";
free(p2);
return a;
}
int main(void)
char *p = test();
puts(p);
return 0;
上面程序运行将会出现内存奔溃,为什么呢?就是因为p2在数据存储区,这个区的内存是不能被free的,同理,假如free栈内存,那也是不允许的,会出现段错误。上面例子还有一点,就是返回了栈内存,这也是有问题的,返回栈内存结果得到的就是一堆垃圾。所以记住一个结论:
free只能用在申请到的动态内存,并且不能free一个已经free了的内存;不要return一个栈内存空间。