内存四区
代码区(text段)、数据区(静态全局区(bss、data)、常量区(rodata))、堆区(heap)、栈区(stack)
代码区
存放程序二进制代码,编译时已经确定,通常为只读存储区
数据区
数据区分为静态全局区和常量区
静态全局区
静态(全局)区存储全局变量和静态变量,静态区又可分为:
- bss段bss段存储未初始化的全局变量和静态变量
- data段
data段存储已经初始化的全局变量和静态变量
常量区
常量区(rodata段)存储const修饰的全局变量,#define定义的常量,字符串常量
堆区
由程序员手动申请和释放的内存空间,如果不释放,程序结束后可能由系统回收
堆上分配空间:
- 1.malloc:
函数原型:void* malloc(unsigned size);
不能给指针初始化 - 2.realloc:
函数原型:void* realloc(void* ptr, unsigned newsize);
给已经分配了地址的指针分配新的空间,ptr原有空间的地址,newsize新申请空间的长度 - 3.calloc:
函数原型:void* calloc(size_t numElements, size_t sizeOfElement);
可以给分配好空间的指针初始化
堆上空间释放:
free
未释放会造成段错误
重复释放造成段错误
栈区
由编译器自动分配和释放,存放局部变量和函数的形参并在其生命周期结束后自动释放