———-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;
}