首页 > 编程知识 正文

c语言内存分配与释放,二维数组动态分配内存

时间:2023-05-04 20:04:19 阅读:9506 作者:3446

通知

写博客是为了记录开发中涉及的技术和遇到的问题的解决,如果那个博客对你有帮助的话,希望你能关注/喜欢; 如果对报道内容有什么不同的见解,请在信息中讨论。 谢谢你!

)二) 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没有实际释放内存) )。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。