通知
写博客是为了记录开发中涉及的技术和遇到的问题的解决,如果那个博客对你有帮助的话,希望你能关注/喜欢; 如果对报道内容有什么不同的见解,请在信息中讨论。 谢谢你!
)二) c语言的动态内存分配
一.静态内存分配
指定分配存储器的长度是静态存储器分配,定义为分配给堆栈存储器
int a[1024];
二、c语言内存分配
1、堆栈区域(堆栈)。
在windows上,堆栈内存被分配2M (规定的常数),超出限制,提示堆栈溢出错误;
堆栈区域中的内存将自动分配并自动释放
2、堆(heap )。
程序员手动分配内存,手动释放内存,占用操作系统80%的内存,用malloc分配内存
//为堆内存分配40M内存
//malloc参数为字节
//malloc返回值为void *,是任意类型的指针
int * p=malloc (1024 * 1024 * 10 * sizeof ) int );
//释放分配的内存
free(p;
卡尔洛c
使用realloc重新分配内存
创建数组并动态指定数组大小(在程序运行时,可以自由打开指定大小的内存进行使用; 对于Java集合)
void main () }
//静态内存分配创建数组,数组大小固定
//int a[10];
int len;
printf ('输入数组长度:');
扫描(' % d ',len );
//打开内存
int*p=malloc(len*sizeof ) int );
//p是数组的起始地址
//为数组元素赋值(使用此刚打开的内存空间) )。
int i=0;
for (; i len; I ) {
p[I]=rand(0;
printf(%d、%#x(n )、p[i]、p[i];
}
//扩大刚分配的内存空间
printf ('重新输入数组长度:');
扫描(' % d ',len );
//参数说明
//1 :原始内存的指针
//2 :内存扩大后的总大小
int*P2=realloc(p,sizeof(int ) * len );
//重新赋值
i=0;
for (; i len; I ) {
P2[I]=rand(0;
printf(%d、%#x(n )、p2[i]、p2[i];
}
//手动释放内存
if(p!=空) {
free(p;
p=空值;
}
if(p2!=空) {
free(P2;
p2=空;
}
getchar (;
}
输入结果为(参考) :
输入数组长度: 6
41,0x 202330
67,0x 202334
34,0x 202338
0,0x20233c
69,0x 202340
24,0x 202344
3、全局区域或静态区域
4、文字常数
5、程序代码区域
三.静态内存分配与动态内存分配的区别
静态内存分配、分配内存大小固定容易出现以下问题:
容易超过堆栈存储器的最大值
为了防止内存不足,会打开更多内存,容易浪费
动态内存分配,动态指定程序运行过程中使用的内存大小,可以手动释放,释放后也可以重用这些内存; 容易发生以下问题:
缩小后,缩小部分的数据会丢失
扩大(连续),如果在当前存储器段之后有需要的存储器区域,则直接扩大该存储器区域,realloc返回到原始指针; 如果当前内存段后面的空闲字节不够,请长期使用堆中的第一个内存块,将当前数据复制到新位置,释放原始数据并返回到新的内存地址。 如果申请失败,返回NULL将启用原始指针的无私鸡翅。
四.内存分配的若干注意事项
不能多次释放
发行完成后,将指针设置为空
内存泄漏(p重载赋值后,free没有实际释放内存) )。