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