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一个栈内存空间。