1.各段说明

(1)代码区:加载的是可执行文件代码段,其加载到内存中的位置由加载器完成。
(2)全局初始化数据区:加载的是可执行文件数据段,存储于数据段(全局初始化,静态初始化数据)的数据的生存周期为整个程序运行过程。
(3)未初始化数据区:加载的是可执行文件BSS段,位置可以分开亦可以紧靠数据段,存储于数据段的数据(全局未初始化,静态未初始化数据)的生存周期为整个程序运行过程。
(4)栈区:由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间。
(5)堆区:用于动态内存分配。堆在内存中位于未初始化数据区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时不会自动释放,可能会造成内存泄漏。

2.栈和堆的区别

(1)管理方式不同。(2)空间大小不同。(3)产生碎片不同。(4)增长方向不同。(5)分配方式不同。(6)分配效率不同。

3.内存管理函数

memcpy()函数将n个字节从src所指向的位置拷贝到dest所指向位置,函数声明如下:
extern void memcpy(void_restriet_dest,_const void*_restrict_src,size_t_n),
memcpy()函数在实现内存单元拷贝时没有考虑源空间和目的空间 有可能重叠的情况,memmove()函数在源码的实现上考虑到了这一因素,此函数声明如下:
extern void memmove (void _dest,_const void*_src,size_t_n)
memset()函数将初始化指定内存单元,该函数声明如下:
extern void memset(void_s,int_c,size_t_n)_throw_nonnull((1));
此函数将设置自s开始后面n位的值为c,如果执行成功,返回s的首地址。

Last modification:December 16th, 2019 at 05:49 pm
如果觉得我的文章对你有用,请随意赞赏