C语言动态内存分配详解:深入剖析malloc、calloc、realloc函数
C语言动态内存分配详细解析:malloc、calloc、realloc

在C语言里,动态内存分配是一种关键的内存管理方式。它能让程序在运行之际请求以及释放内存。这给处理大小不确定的数据结构带来了很大灵活性。比如链表、数组等。C标准库给出了一组函数用于管理动态内存。其中有malloc、calloc和realloc。本文会详细介绍这三个函数以及它们的使用办法。还会借助示例代码来讲解
malloc1. 功能简介
malloc函数用来分配未初始化的内存块,其字节数是指定的。要是成功,就返回指向该块的指针。要是失败,便返回NULL。
[id_828024210]
ounter(linevoid* malloc(size_t size);
3. 使用示例
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineint main() {int *arr;int n;printf("请输入数组大小: ");scanf("%d", &n);// 动态分配 n 个整数空间arr = (int*)malloc(n * sizeof(int));if (arr == NULL) {printf("内存分配失败!\n");return 1;}// 使用动态数组for (int i = 0; i < n; i++) {arr[i] = i + 1; // 初始化数组元素printf("%d ", arr[i]);}// 释放已分配的内存free(arr);return 0;}
calloc1. 功能简介
calloc函数可动态分配一块连续内存空间。该空间会被初始化为零。它适用于需同时指定数量和大小的情况。
2. 原型
ounter(linevoid* calloc(size_t num, size_t size);
3. 使用示例
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineint main() {int *arr;int n;printf("请输入数组大小: ");scanf("%d", &n);// 动态分配 n 个整数空间并初始化为零arr = (int*)calloc(n, sizeof(int));if (arr == NULL) {printf("内存分配失败!\n");return 1;}// 输出初始值(应全部为0)for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}// 使用完毕后释放已申请的内存free(arr);return 0;}
realloc1. 功能简介
当您要更改之前已申请的动态数组或数据块大小时 可使用realloc函数 它能增加或减少所需总体量 要确保原来的数据不丢失
2. 原型
ounter(linevoid* realloc(void* ptr, size_t new_size);
### 3. 使用示例
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineint main() {int数组、新大小、原始大小original_size =5 ;// 初始申请一个包含5个整数元素的小数组arr = (int*)malloc(original_size * sizeof(int));for(int i=0;iarr[i]=i+1;}printf("原始数组: ");for(int j=0;jprintf("%d ",arr[j]);}new_size=10;/* 调整新数字,更大 从5变成10 */arr=(int*)realloc(arr,new_size*sizeof(int));if(arr==NULL){printf("\n调整后的 内 存 分 配 消 息 件 出 错!");exit(1);}/* 为新添加的位置赋值 */for(int k=original_size;karr[k]=k+1;}/* 打印新的完整集合 */printf("\n新的 数组: ");for(int l=0;lprint ("%d " , ar [l] );}free(arr);return 除( );}
注意事项
检查空指针:不管使用何种虚拟情况,任何方面都很关键。一定要检查返回获取的底层地址是否为空,以此避免程序崩溃。正确释放资源:所有通过动态方法创建的用于持久替代记忆类型内容的操作,都必须确保释放相应权限,否则会出现泄漏问题。避免重复释放:不应该多次尝试对同一个对象进行销毁操作。这种做法会导致未定义行为。也容易引起错误。这是编程中最常见且最容易出现问题的情况之一。
总结来说 在理解了C中常用自适应特征调用后 就能够有效实施 可在任何需求设定下进行 各类快速标识器后期便于轻松捋顺 能得到更高效区间