c语言中的动态内存管理
在 C 语言中,动态内存管理主要通过以下几个函数实现:
一、malloc 函数
功能: malloc 函数用于在内存的动态存储区中分配一块长度为 size 字节的连续区域。函数返回一个指向分配区域起始地址的指针,如果分配失败则回 NULL
示例:
二、calloc 函数
功能: calloc 函数用于在内存的动态存储区中分配 n 个长度为 size 字节的连续区域,并将分配的内存初始化为 0。函数返回一个指向分配区域起始地址的指针,如果分配失败则返回 NULL 。
示例:
三、realloc 函数
功能: realloc 函数用于调整先前由 malloc 、 calloc 或 realloc 分配的内存块的大小。新的大小由 size 指定。如果新大小大于旧大小,可能会移动内存块以提供更多空间;如果新大小小于旧大小,可能会截断内存块,但不会释放多余的空间。函数返回一个指向调整后内存块起始地址的指针,如果分配失败则返回 NULL 。
示例:
四,free函数
在 C 语言中, free 函数用于释放动态分配的内存空间。
一、函数原型
void free(void *ptr);
它接受一个参数 ptr ,这是一个指向要释放的内存块的指针。这个指针应该是之前通过 malloc 、 calloc 或 realloc 函数分配的内存的地址。
二、使用方法
例如:
三、注意事项
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);
}