天天看点

C语言中堆内存、栈内存、静态数据存储区的理解

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