C程序的储存空间分布


在这里插入图片描述
编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分。

正文段(代码段)

这是由CPU执行的机器指令的部分,代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。通常代码段是共享的,所以即使是频繁执行的程序在储存器中也只需有一个副本,另外正文段通常是只读的,以防止程序由于意外而修改其指令,例如char *p=“fuck you”;中的“fuck you”是常量字符串而不是变量字符串它被放在代码段的,如果妄图去修改它会导致段错误的发生。

初始化数据段(数据段)

初始化数据段。通常将此段称为数据段(也被称为数据区、静态数据区、静态区)数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据),它包含了程序需要明显赋值的变量,例如,C程序中任何函数之外的声明:int count=99;
显式初始化为非零的全局变量和静态局部变量放在数据段。

未初始化数据段(bss段)

未初始化数据段通常将此段称之为bss段,内核将此段中的数据初始化为0或空指针。
未初始化或显式初始化为0的全局变量放在bss段。
bss段的特点就是被初始化为0,bss段本质上也是属于数据段,bss段就是被初始化为0的数据段。
注意区分:数据段(.data)和bss段的区别和联系:二者本来没有本质区别,都是用来存放C程序中的全局变量的。区别在于把显示初始化为非零的全局变量存在.data段中,而把显式初始化为0或者并未显式初始化(C语言规定未显式初始化的全局变量值默认为0)的全局变量存在bss段。

运行时自动分配&自动回收:栈是自动管理的,程序员不需要手工干预。方便简单。
反复使用:栈内存在程序中其实就是那一块空间,程序反复使用这一块空间。
脏内存:栈内存由于反复使用,每次使用后程序不会去清理,因此分配到时保留原来的值。使用栈内存时要要初始化(定义局部变量)。
临时性:(函数不能返回栈变量的指针,因为这个空间是临时的)
栈会溢出:因为操作系统事先给定了栈的大小,如果在函数中无穷尽的分配栈内存总能用完。例如函数递归调用没有收敛会导致栈溢出,或者是在函数中定义的局部变量太大也会用完栈内存从而导致栈溢出。

操作系统堆管理器管理:堆管理器是操作系统的一个模块,堆管理内存分配灵活,按需分配。
大块内存:堆内存管理者总量很大的操作系统内存块,各进程可以按需申请使用,使用完释放。如果申请了内存使用完毕后没有释放会导致内存泄漏,还有就是如果p=(char*)malloc(16);申请了空间并且指针p已经指向了申请的空间,但是中途又来一个p=&fuck;对p指针进行赋值让其指向另一个内存空间,这就造成了原先申请的存储地址丢失,从而导致内存泄漏。当程序不断地发生内存泄漏,堆管理器没能够及时的回收内存,当程序再次申请内存时堆管理器已经没有内存能够分配给当前进程了,这样就发生了内存溢出,最终导致程序运行崩溃。
程序手动申请&释放:手工意思是需要写代码去申请malloc和释放free。
脏内存:堆内存也是反复使用的,而且使用者用完释放前不会清除,因此也是脏的。在malloc申请了得到堆空间后应该马上对他进行初始化memset(p,0,sizeof(p));
临时性:堆内存只在malloc和free之间属于我这个进程,而可以访问。在malloc之前和free之后都不能再访问,否则会有不可预料的后果。
gcc中的malloc默认最小是以16B为分配单位的。如果malloc小于16B的大小时都会返回一个16字节的大小的内存。malloc实现时没有实现任意自己的分配而是允许一些大小的块内存的分配。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值