内存的管理和使用
size hello
text 代码区静态数据
data 全局初始化数据区
bss 未初始化数据区
一个计算机应用程序在内存中可以分成两个部分:存放代码的代码段和存放数据的数据段。代码段存放用户编写的代码,数据段可以分成堆和栈
数据段有增加了全局初始化数据区(initialized data segment / data segment)包含程序中明确被初始化的全局变量、静态变量(包括全局和局部静态变量)以及常量(例如字符串)
未初始化数据区(uninitialized data segment)bss区 存放全局未初始化变量
栈
有编译器分配释放的区域,用来存放函数的参数,局部变量等。当调用函数的时候,被调用函数的参数和返回值被存储到当前程序的栈区,之后被调用函数再为自身的自动变量和临时变量在栈区上分配空间。当函数调用返回时,在战区内的参数返回值,自动变量和临时变量等会被释放。
这就是为什么C语言函数参数如果不是指针的话,被修改的参数结果用户无法得到的原因。
堆 heap
位于bss段和栈之间,用来动态分配内存。这段区域有程序员管理
堆的管理和栈不同,操作系统在堆空间维护一个链表,每次程序员从堆分配内存的时候,操作系统会从堆区扫描未用空间,当一个空间的大小符合申请空间的时候,就把此空间返回给程序员,同时把申请的空间加入链表。、
程序的内存分成若干区域基于以下考虑:
程序运行的时候多数按照顺序运行的,虽然有跳转和循环 数据需要多次访问 开辟单独的数据空间方便数据访问和分类
临时数据放在栈区
全局数据和静态数据在整个程序执行过程中都可能需要访问,因此单独存储管理
用户需要自行分配的内存安排在堆区,便于用户管理内存,以及操作系统监控
malloc返回的是分配内存的首地址
calloc 分配新内存 realloc用来改变一块已经分配的内存大小
void *calloc(size_t nmemb, size_t size)nmemb 表示要分配元素个数 size表示每个元素大小
malloc函数分配内存后不能初始化内存
calloc 分配空间会初始化新分配的内存空间
int *p = (int *)malloc(1024,sizeof(int))
int *p = (int *)malloc(1024*sizeof(int))
memset(p,0, 1024*sizeof(int))
void *realloc(void *ptr,size_t size)
realloc函数调整后内存空间起始地址有可能与原来不同