个人理解—栈、堆、数据区

        在c语言中,内存管理主要分配在堆(heap)、栈(stack)、数据区(data)。

        栈(stack)具有先进后出的特性(FILO),其内存空间由系统自动分配并自动回收,当定义局部变量时,局部变量就是在栈中实现的,栈管理由于系统的介入变得方便简单。

        栈内存在程序中是一块固定的空间,在程序运行过程中会被反复的使用。

        当局部变量销毁时,栈指针只是将指向的局部变量栈位置进行了改变,并未对其内存空间进行清理,本质上就是只移动了指针,不改变变量,就像是公交车你坐完他坐并不会对椅子进行清理,这就形成了脏内存,这就是局部变量不进行初始化其值随机的原因,栈只移动指针进行栈管理提高了内存运行效率。

        栈具有临时性,函数无法返回栈变量指针,返回局部变量指针后对原数据进行操作具有极大的安全隐患,

        栈溢出,程序就分配了那么大的栈,如果一直不停的分配内存空间就会溢出,现象为触发段错误,触发栈溢出经常出现在过大的数组与无限递归。

        与栈由操作系统管理相比,堆内存由堆管理器进行管理。堆管理器是操作系统的一个模块,与栈内存相比,堆内存更大,与栈内存系统自动分配相比,堆管理是按需分配的。

        堆内存的申请与释放使用:

malloc();申请
free();释放

       堆内存也存在脏内存情况,其原因也是反复使用造成的。

       堆内存的临时性:堆内存只有在malloc和free之间属于这个进程。

        malloc返回一个void*类型的指针,其指向开辟空间的首地址,申请1000个int类型的空间方法如下:

int *p=(int *)malloc(1000*sizeof(int));

        之前的文章说过一个问题,为什么会存在void类型,现自来把这个坑填上,在不知道返回数据属于什么类型时,也没必要知道其类型,类型不确定,但是在需要时可以被指定。这时就会使用到void类型。

        malloc成功申请内存时会返回指针,但失败会返回NULL。所以在malloc申请内存要进行NULL检查。

        释放上面申请的1000个int的内存空间free(p)。

        在*p与malloc绑定后,千万不要改变指针的指向,否则会出现地址丢失造成吃内存、内存泄漏的现象,直到进行结束。所以可以使用const对指针进行限制。

        上面申请了1000个int类型的空间,可以当作大数组使用,使用方法为:

*(p+0)=1;
*(p+1)=2;

        free()后指针归位,但在改空间未被污染的情况下,数据依旧存在,但是最好不要进行访问或改写,因为堆管理器进行管理,内存进行重新分配给新的进程函数。所以当free释放内存空间后可以让指针指向NULL,避免造成上面的情况或变成野指针。

        在使用p指向的内存空间前,一定要进行NULL==p的判别,其一是查看申请是否成功,其二是检查内存空间是否已被释放。

        数据段:存放全局变量(.data)以及static数据。

        代码段:存放代码的可执行部分以及常量数据.

        bss段:(零初始化段)本质上是数据段,但是是被初始化为0的数据以及并未进行显示初始化的全局变量,这就是为什么全局变量未初始化其值为0的原因。

        const的实现原理:①数据存放在代码段。②编译器检查。

        static局部变量存放在数据段,一般的局部变量存放在栈上。

        堆:手动控制,没自动化管理一说,除非进程结束。

        栈:编译器提供管理,无需人工干预。

char a[]="linux";(局部变量)存放在栈上
char a[]="linux";(全局变量)存放在数据段上

char *p=(char *)malloc(10*sizeof(char));p存放在堆上
if(NULL!=p)
{
    memset(p,0,10);空间归零处理
    strcpy(p,"linux");将数据存入该堆内存空间
}else{
}

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值