C语言动态内存分配

本文详细介绍了程序内存分配的三种主要方式:静态存储区分配、栈上分配及堆上动态分配。探讨了malloc、free、calloc与realloc等关键函数的使用方法,并列举了常见的内存错误及其避免策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思维导图:

内存分配的方式:

1.在静态存储区中进行分配

内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,静态变量(static)。

2.在栈中进行分配

在执行函数时,函数内部局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储被自动释放,效率很高,但是分配的内容比较有限。

3.在堆中分配

在堆上分配也称为动态内存分配:程序在运行的时候用malloc等函数申请任意多少的内存,程序猿自己负责用的时候在何时用free释放内存。动态内存分配的生存期有我吗自己决定,使用非常灵活,但是问题也比较多。注意:如果没有释放的话,很容易会造成内存溢出,因为堆中的内存块是全局的,因此不会因为函数的调用而结束。

动态内存分配中使用的函数:

malloc函数:需要头文件<malloc.h>

void* malloc(size_t size) //返回的是一个通用类型的指针,根据需要进行强转

功能:允许从空闲内存池中分配连续内存但不初始化 

参数:size参数实际就是一个所需字节数的整数 malloc(20)

返回:若分配成功则返回一个指向该内存块的指针,在使用时可根据需要做强制类型转换,否则返回NULL(空指针)//需要判空 

TIPS:申请malloc的时候尽量去给它进行一下初始化,防止后面出现一些不确定性的东西。

malloc的生命周期:只要没有调用free这个函数,进程没有结束,那么此时,这个函数的生命周期就会一直存在在内存中;它是存放在堆空间中的,它不会因为你去函数调用的结束自动去释放,堆当中的内存是全局的 

free函数:free函数与malloc函数是成对出现的

int* p=(int*)malloc(n*sizeof(int)); //动态分配一个整数数组
free(p); //释放掉堆内存

free之后,申请内存的那个指针就会变成野指针(声明了,但是没有任何指向的指针),有时候会出现野指针错误; 
所以尽量在操作之后:将指针置为NULL 
p=NULL; 

注意:申请和释放是成对的,所以程序是不能进行多次free的,否则会崩溃的

calloc函数:需要用到的头文件stdlib.h 

void* calloc(size_t num_elements,size_t element_size);

功能:功能同malloc是一样的,但是作初始化 

参数:num_elements是所需的元素的数量,element_size是每个元素的字节数

返回:同malloc一样

也是需要free()释放内存,成对出现。

realloc函数:需要用到的头文件<stdlib.h>,动态扩大缩小申请的内存 

void* realloc(void* ptr,size_t new_size)

功能:在指针ptr指向的内存基础上扩大或者缩小内存 

参数:ptr是指向先前通过malloc,calloc和realloc函数后分配的内存块的指针,new_size是内存块的新尺寸,可能大于或者小于原有内存尺寸;这个是追加到new_size的新的内存 

realloc在C语言中也被称为动态数。

注意:
1)当扩展内存的时候,不会对添加进内存块的字节进行初始化 
2)若不能调整内存则返回NULL,但原有内存中的数据是不会发生改变的 
3)若第一个参数为NULL那么功能 等同与malloc函数,若第二个参数为0,那么会释放调用内存块

realloc(NULL,10*size(int)); 等同malloc(10*sizeof(int));
realloc(p,0); 等同于free

4)当缩小或者扩大内存时,一般不会对其进行移动,若无法扩大内存块,那么啃呢个会在别处分配新的内存快,然后把旧内存块的数据复制到新块 中,并将旧块删除释放内存。

常见的内存错误:

1)段错误 
      使用未分配成功的内存 
             避免方式:在使用内存之前检查指针是否为NULL; 
      引用分配成功但尚未初始化的内存 
             避免方式:赋予初值,即便是赋予零值也不可省略 
      内存分配成功并且已经初始化,但操作越过了内存的边界 
             避免方式:注意下标的使用不能超出边界 
      忘记释放内存,造成内存泄露 
             避免方式:申请内存的方式和释放内存的方式需要成双成对 
      释放内存之后却继续去使用这一块内存 
             避免方式:使用free内存之后,把指针置为NULL;

内存错误的注意点: 
       指针消亡了,并不表示它所指向的内存会被自动释放,(在free之前,直接将指针设为NULL); 
       内存释放了,并不代表指针会消亡或者成了NULL指针;(在free之后,指针并没有进行NULL设置)

野指针: 
       野指针的形成是指针变量没有被初始化,任何指针变量刚被创建的时候不会自动成为NULL指针,它的缺省值是最忌的,它会乱指一气

指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法内存

free内存块之后,需要将指针设置为NULL,如果没有设置为NULL,也会出现“野指针”,它是指向“垃圾”内存的指针;

多次free内存块,是会导致程序崩溃的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值