C语言内存类型

三种内存来源:栈(stack)、堆(heap)、数据区(.data)
1.栈的详解:
    运行时自动分配&自动回收:栈是自动管理的,程序员不需要手工干预。方便简单。
    反复使用:栈内存在程序中其实就是那一块空间,程序反复使用这一块空间。
    脏内存:栈内存由于反复使用,每次使用后程序不会去清理,因此分配到时保留原来的值。
    临时性:(函数不能返回栈变量的指针,因为这个空间是临时的)
    栈会溢出:因为操作系统事先给定了栈的大小,如果在函数中无穷尽的分配栈内存总能用完。
2.堆内存详解:
    操作系统堆管理器管理:堆管理器是操作系统的一个模块,堆管理内存分配灵活,按需分配。
    大块内存:堆内存管理者总量很大的操作系统内存块,各进程可以按需申请使用,使用完释放。
    程序手动申请&释放:手工意思是需要写代码去申请malloc和释放free。
    脏内存:堆内存也是反复使用的,而且使用者用完释放前不会清除,因此也是脏的。
    临时性:堆内存只在malloc和free之间属于我这个进程,而可以访问。在malloc之前和free之后
        都不能再访问,否则会有不可预料的后果。
3.堆内存使用范例:
    (1)void *是个指针类型,malloc返回的是一个void *类型的指针,实质上malloc返回的是堆管理器分配给我本次申请的那段内存空间的首地址(malloc返回的值其实是一个数字,这个数字表示一个内存地址)。为什么要使用void *作为类型?主要原因是malloc帮我们分配内存时只是分配了内存空间,至于这段空间将来用来存储什么类型的元素malloc是不关心的,由我们程序自己来决定。
    (2)什么是void类型。早期被翻译成空型,这个翻译非常不好,会误导人。void类型不表示没有类型,而表示万能类型。void的意思就是说这个数据的类型当前是不确定的,在需要的时候可以再去指定它的具体类型。void *类型是一个指针类型,这个指针本身占4个字节,但是指针指向的类型是不确定的,换句话说这个指针在需要的时候可以被强制转化成其他任何一种确定类型的指针,也就是说这个指针可以指向任何类型的元素。
    (3)malloc的返回值:成功申请空间后返回这个内存空间的指针,申请失败时返回NULL。所以malloc获取的内存指针使用前一定要先检验是否为NULL。
    (4)malloc申请的内存时用完后要free释放。free(p);会告诉堆管理器这段内存我用完了你可以回收了。堆管理器回收了这段内存后这段内存当前进程就不应该再使用了。因为释放后堆管理器就可能把这段内存再次分配给别的进程,所以你就不能再使用了。
    (5)再调用free归还这段内存之前,指向这段内存的指针p一定不能丢(也就是不能给p另外赋值)。因为p一旦丢失这段malloc来的内存就永远的丢失了(内存泄漏),直到当前程序结束时操作系统才会回收这段内存。
4.代码段、数据段、bss段:
    代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。
    数据段(也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据)
    bss段(又叫ZI(zero initial)段):bss段的特点就是被初始化为0,bss段本质上也是属于数据段,bss段就是被初始化为0的数据段。

5.总结:
    栈内存对应C中的普通局部变量(别的变量还用不了栈,而且栈是自动的,由编译器和运行时环境共同来提供服务的,程序员无法手工控制);堆内存完全是独立于我们的程序存在和管理的,程序需要内存时可以去手工申请malloc,使用完成后必须尽快free释放。(堆内存对程序就好象公共图书馆对于人);数据段对于程序来说对应C程序中的全局变量和静态局部变量。

参考:http://www.zhulaoshi.org/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值