c中动态申请内存的细节问题

c语言中动态内存常用到4个函数

malloc   原型void * malloc(size_t size);

用于动态开辟size大小的空间。

 

calloc  原型void *calloc(size_t num,size_t size);

用于对已开辟的数组元素初始化为0

num为数组中元素个数,size为每个元素的字节长度

 

realloc  原型void*realloc(void *memblock,size_t size); 

用于对已开辟好的动态内存重新修改大小

membloc是以前动态开辟的内存块,size是重新开辟的内存大小

 

free 原型void free(void *memblock);

用于释放动态开辟的内存

memblock是以前动态开辟的内存

 

这几个函数用于在堆上动态开辟内存,由于对空间不属于操作系统自动管理,所以这段内存的开辟和释放都需要我们自行管理。

在这里常常会出现以下几个问题

(1)忘记free

忘记释放内存会让程序在为结束时一直占用堆内存,影响性能;

(2)指向malloc申请内存的指针指向被修改,造成free时的程序崩溃

#include<malloc.h>
#include<stdio.h>

int main()
{
#define LNE 10
    int *arr = (int *)malloc(sizeof(int)*LEN);

    arr++;
    free(arr);
    return 0;
}

上述代码为了演示free掉一个改变申请时位置的指针,arr改动较为简单。但在程序编写过程中,我们常常对malloc申请的数组进行改值,又是不可避免的要改动指针,所以在改动时不妨添加一个指针变量指向arr。

(3)悬挂指针(也叫悬空指针)

悬挂指针指的是free后的指针未作处理。如上面代码中的arr。虽然arr动态开辟空间,又正常归还,但是如果在以后的代码中使用arr指针依然可能会出现问题。因为此时arr指向的空间已被释放,无法通过arr访问任何空间,所以一般为了规避这个问题,会在free后直接将arr置空,说明arr是一个“没人要的孩子”。

(4)重复释放同一片内存

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值