您的位置:首页 > 编程语言 > C语言/C++

黑马程序员——C语言内存管理

2015-08-23 14:49 429 查看
———-android培训、Java培训、iOS培训,期待与您交流———-

一、内存的分区



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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 内存管理