c语言中的动态内存管理

在 C 语言中,动态内存管理主要通过以下几个函数实现:

 

一、malloc 函数

 

功能: malloc 函数用于在内存的动态存储区中分配一块长度为 size 字节的连续区域。函数返回一个指向分配区域起始地址的指针,如果分配失败则回 NULL 

示例:

bc3696cca3274504afe31f84d93b1362.png

 

 

 

二、calloc 函数

 

功能: calloc 函数用于在内存的动态存储区中分配 n 个长度为 size 字节的连续区域,并将分配的内存初始化为 0。函数返回一个指向分配区域起始地址的指针,如果分配失败则返回 NULL 。

示例:

abf99b3f90144d10a3ddddd5ec58a248.png

 

 三、realloc 函数

 

 功能: realloc 函数用于调整先前由 malloc 、 calloc 或 realloc 分配的内存块的大小。新的大小由 size 指定。如果新大小大于旧大小,可能会移动内存块以提供更多空间;如果新大小小于旧大小,可能会截断内存块,但不会释放多余的空间。函数返回一个指向调整后内存块起始地址的指针,如果分配失败则返回 NULL 。

示例:

054f67155a5d4276a123a17c9d8cb92b.png


四,free函数

 

在 C 语言中, free 函数用于释放动态分配的内存空间。
 
一、函数原型
 
 void free(void *ptr); 
 
它接受一个参数 ptr ,这是一个指向要释放的内存块的指针。这个指针应该是之前通过 malloc 、 calloc 或 realloc 函数分配的内存的地址。
 
二、使用方法
 
例如:
 
52d97a1006f14b7ab46b0fba0d81f8e5.png
 
 
三、注意事项
 
1. 确保只释放已分配的内存:传递给 free 的指针必须是由动态内存分配函数返回的有效指针,否则可能会导致未定义的行为。
2. 避免重复释放:对同一内存块多次调用 free 可能会导致错误,应该确保只释放一次内存。
3. 释放后避免继续使用指针:释放内存后,指针仍然指向原来的内存地址,但该内存已经不可用。为了避免错误,最好将指针设置为 NULL 。

 

在 C 语言中,使用动态内存管理时常见的错误有以下几种:

 

一、内存泄漏

 

- 表现:申请了动态内存但没有在合适的时候释放,导致内存资源一直被占用,随着程序的运行,可能会耗尽系统。

 二、悬空指针

 表现:指针指向的内存被释放后,指针没有被置为 NULL 或重新赋值,继续使用该指针会导致未定义行为。

-示例:

void danglingPointerExample()

{

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

    free(ptr);

    // 这里 ptr 成为悬空指针

    int value = *ptr; // 错误,未定义行为

}

 

 三、重复释放

 

- 表现:对同一块已经释放过的内存再次调用 free 函数,可能会导致程序崩溃或其他不可预测的结果。

- 示例:

void doubleFreeError()

{

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

    free(ptr);

    // 再次释放

    free(ptr);

}

 

四、内存越界访问

 

- 表现:通过指针访问超出动态分配内存范围的地址,可能会破坏其他内存区域的数据,导致程序出现错误。

- 示例:

void outOfBoundsAccess()

{

    int *ptr = (int *)malloc(5 * sizeof(int));

    // 访问超出分配内存范围的地址

    ptr[10] = 20;

    free(ptr);

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值