黑马程序员——C语言内存管理
2015-08-23 14:49
429 查看
———-android培训、Java培训、iOS培训,期待与您交流———-
![](https://img-blog.csdn.net/20150823144903718)
BSS段:存储未初始化的全局变量和静态变量
数据段:存储已初始化的全局变量和静态变量
代码段:存储程序的执行代码
堆(heap):存放进程运行中动态分配的内存段
栈(stack):存放程序临时创建的局部变量
在栈上创建,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中,效率很高,但是分配的内存容量有限。
从堆上分配,亦称为动态内存分配。程序在运行的时候用malloc或new申请任意的内存,程序员自己负责何时用free或delete释放内存。动态内存的生存期限由程序员决定,使用灵活。
size是指分配内存的字节数
说明:该方法包含在库函数stdlib.h中,作用是在内存的堆区分配一个大小为size的连续空间,如果分配内存成功,函数返回新分配内存的首地址,否则返回NULL。
例如,申请一段内存空间存放3个float类型的变量,代码如下:
使用calloc可以限制申请内存空间的大小。例如:calloc(4,sizeof(int));申请16个字节的内存空间。而实用malloc则不限制大小。
说明:当使用malloc或calloc申请的内存空间不够,需要扩充时,可以使用realloc。realloc会在内存中寻找一块扩充后大小的内存空间,如果原来的内存空间之后就有足够多的空闲空间,那么直接进行扩展。如果不够就会在内存中的其他区域寻找,当找到后会将原来内存空间前部分的值复制到新的空间中。
例如,在上例的基础上,要将存储的数值增加到40个,那么执行如下代码:
一、内存的分区
BSS段:存储未初始化的全局变量和静态变量
数据段:存储已初始化的全局变量和静态变量
代码段:存储程序的执行代码
堆(heap):存放进程运行中动态分配的内存段
栈(stack):存放程序临时创建的局部变量
二、内存的分配方式
从静态存储区分配,内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量和static变量。在栈上创建,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中,效率很高,但是分配的内存容量有限。
从堆上分配,亦称为动态内存分配。程序在运行的时候用malloc或new申请任意的内存,程序员自己负责何时用free或delete释放内存。动态内存的生存期限由程序员决定,使用灵活。
三、常用的动态内存分配函数
1. malloc
使用方法:void *malloc(unsigned size)size是指分配内存的字节数
说明:该方法包含在库函数stdlib.h中,作用是在内存的堆区分配一个大小为size的连续空间,如果分配内存成功,函数返回新分配内存的首地址,否则返回NULL。
例如,申请一段内存空间存放3个float类型的变量,代码如下:
#include <stdio.h> #include <stdlib.h> int main(int argc, const char * argv[]) { float *p = (float *)malloc(3*sizeof(float)); if (p) { *p = 3.14; *(p+1) = 5.33; *(p+2) = 0.62; }else{ printf("内存申请失败"); } for (int i=0; i<3; i++) { printf("%.2f\t",*(p+i)); } return 0; }
2. calloc
使用方法:calloc(块数,长度)使用calloc可以限制申请内存空间的大小。例如:calloc(4,sizeof(int));申请16个字节的内存空间。而实用malloc则不限制大小。
#include <stdio.h> #include <stdlib.h> int main(int argc, const char * argv[]) { int *p = (int *)calloc(4, 4); if (p) { *p = 2; *(p+1) = 5; *(p+2) = 3; *(p+3) = 6; }else{ printf("内存申请失败"); } for (int i=0; i<4; i++) { printf("%d\t",*(p+i)); } return 0; }
3. realloc
使用方法:realloc(指针变量名,内存字节数)说明:当使用malloc或calloc申请的内存空间不够,需要扩充时,可以使用realloc。realloc会在内存中寻找一块扩充后大小的内存空间,如果原来的内存空间之后就有足够多的空闲空间,那么直接进行扩展。如果不够就会在内存中的其他区域寻找,当找到后会将原来内存空间前部分的值复制到新的空间中。
例如,在上例的基础上,要将存储的数值增加到40个,那么执行如下代码:
#include <stdio.h> #include <stdlib.h> int main(int argc, const char * argv[]) { float *p = (float *)calloc(5, sizeof(float)); if (p) { *p = 2.67f; *(p+1) = 5.23f; *(p+2) = 3.44f; *(p+3) = 6.22f; *(p+4) = 5.11f; }else{ printf("内存申请失败"); } p = realloc(p, 40*sizeof(float)); *(p+39) = 3.66; printf("%.2f\n",*(p+39)); for (int i=0; i<5; i++) { printf("%.2f\t",*(p+i)); } return 0; }
相关文章推荐
- Lua和C语言的交互详解
- Lua的内存管理浅析
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言内存对齐实例详解
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- C语言进制转换代码分享
- 基于C语言fflush()函数的使用详解
- C语言单链队列的表示与实现实例详解
- 关于C语言除0引发的思考
- 深入分析C中不安全的sprintf与strcpy