【C语言】动态内存申请

目录

前言

内存的申请—malloc()

注意:

内存释放—free()

防止野指针出现

其他的一些函数

calloc函数

realloc函数

最后一个注意


前言

为什么要使用动态内存申请,首先,内存是宝贵的,我们在写程序的时候经常需要使用到内存空间,如果空间较小,我们可以定义变量来提前申请一部分静态的空间,但如果内存较大,预存太多的空间则显得比较浪费,这个时候动态内存申请就可以发挥作用了。

其二,动态内存申请的空间是动态的,可以用完之后在程序内释放。

其三,暂时没想到。

内存的申请—malloc()

以面是 malloc() 函数的声明:

void *malloc(size_t size)

参数size是你要申请的内存大小(单位:字节),返回值是一个void类型的指针,指向被分配空间的首个字节地址。所以我们一般要对其进行强制类型转换。

malloc常与sizeof运算符一同使用

int *a;
a = malloc(sizeof(int));

注意:

申请内存失败时,该函数会反回NULL,申请时最好做好判断准备。

内存释放—free()

下面是 free() 函数的声明。

void free(void *ptr)

参数是要释放的内存的地址,该函数不返回任何值,所以应该不存在释放失败的考虑。

注意:

1、申请内存使用完之后一定要将其释放,否则会造成内存泄漏,在程序结束之前这片内存将不能被使用其他程序使用。

2、注意free释放空间只对动态申请的空间起用,不可以手动释放静态申请的空间。否则程序会报错。对已释放的空间重复释放也会报错。

防止野指针出现

free释放完空间之后,存储指针的变量不会被更改,此时指向的是未分配的空间,此指针被称为野指针。所以我们要手动将其置空。

free(a);
a = NULL;

其他的一些函数

calloc函数

声明
void * calloc(size_t nitems, size_t size);

该函数的功能是在堆区中动态申请nitems块,每块大小为size的内存,同样需要使用free释放空间。注意事项。

realloc函数

声明
void *realloc(void *ptr, size_t size)

ptr指向的是已经动态申请过了的空间地址,该函数的功能是对已经动态申请过的空间ptr重新申请一个大小为size的空间。如果原空间地址后面的空间足够多,则该函数直接在原空间进行扩容,如果不够,则开辟一个新空间,然后将原空间销毁,返回新空间地址。

最后一个注意

如果分配内存失败会返回NULL

所以如果以下情况申请失败

int *p = malloc(sizeof(int));
p = realloc(sizeof(int)*2);

就会失去原来malloc分配的内存的地址。

为了防止这种情况发生,我们要最好另外用一个指针来储存realloc的返回值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值