C语言——动态内存管理(malloc、calloc、realloc、free)

本文介绍了C语言中的动态内存管理函数,包括malloc、calloc、realloc和free的使用方法及注意事项。malloc用于按字节分配内存,calloc一次性分配指定数量的元素并初始化为0,realloc可以改变已分配内存的大小,而free则用于释放内存。文章强调了在使用这些函数时需要注意的常见错误,如未成功开辟内存的检查、避免越界访问、正确释放内存等。
摘要由CSDN通过智能技术生成

对于空间的需求,变量,数组都能够解决。但是,有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。

这时候就只能试试动态存开辟了。

在c语言中给出了3个动态内存开辟的函数:malloc、calloc、realloc;

函数详解:

malloc

声明

void *malloc(size_t size)

参数

        size -- 内存块的大小,以字节为单位。

返回值

        该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。

 

calloc

声明

void *calloc(size_t nitems, size_t size)

参数

        nitems -- 要被分配的元素个数。

        size -- 元素的大小。

返回值

        该函数返回一个指针,指向已分配的内存。如果请求失败,则返回 NULL。

realloc

声明

void *realloc(void *ptr, size_t size)

参数

        ptr -- 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。

        size -- 内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针。

返回值

        该函数返回一个指针 ,指向重新分配大小的内存。如果请求失败,则返回 NULL。

三个函数的相同点是:

1.    函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

2.    如果开辟成功,则返回一个指向开辟好空间的指针。

3.    如果开辟失败,则返回一个NULL指针,因此返回值一定要做检查。

4.    返回值的类型是 void* ,所以函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。

5.    如果参数 size 为0,函数的行为是标准是未定义的,取决于编译器。

C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:

void free(void *ptr)

参数

        ptr -- 指针指向一个要释放内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果传递的参数是一个空指针,则不会执行任何动作。

返回值

        该函数不返回任何值。

常见的动态内存错误

1.    动态开辟内存后,要进行判断是否开辟成功;

int* p=(int*)malloc(40);
if(p==NULL)
{
    return -1;
}

2.    不要越界访问,

比如,动态开辟10个空间,你访问12个空间,这是不允许的;

3.    非动态开辟的内存不能使用free释放;

4.    开辟成功后,不能动起始位置指针,如果想动,就拿临时指针拷贝一个;

因为free函数释放是中间只能放动态内存的起始地址,不然会报错;

5.    不能多次释放同一动态内存;

6.    不要忘记释放开辟好的动态内存;

以上一定在开始学时就养成良好习惯,不要丢三落四;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值