当前位置: 首页 > article >正文

深入理解C语言中的内存分配函数:malloc、calloc、realloc

目录:

  • 前言
  • 1. `malloc`:分配内存块
  • 2. `calloc`:分配并初始化内存块
  • 3. `realloc`:重新分配内存块
  • 总结

前言

在C语言编程中,动态内存分配是一个非常重要的概念。它允许我们在程序运行时根据需要分配和释放内存,从而提高程序的灵活性和效率。C语言提供了三个主要的内存分配函数:malloccallocrealloc。本文将详细介绍这三个函数的区别和使用场景。

1. malloc:分配内存块

malloc 是 “memory allocation” 的缩写,用于在堆区分配指定大小的内存块。分配的内存块中的内容是未初始化的,可能包含随机数据。

函数原型:

void* malloc(size_t size);
  • size:要分配的内存块的大小(以字节为单位)。
  • 返回值:成功时返回指向分配内存块的指针,失败时返回 NULL

示例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int* ptr;
    int n = 5;

    // 分配内存
    ptr = (int*)malloc(n * sizeof(int));

    if (ptr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 使用分配的内存
    for (int i = 0; i < n; i++) {
        ptr[i] = i + 1;
    }

    // 打印数组
    for (int i = 0; i < n; i++) {
        printf("%d ", ptr[i]);
    }

    // 释放内存
    free(ptr);

    return 0;
}

注意事项:

  • malloc 分配的内存块中的内容是未初始化的,使用前需要手动初始化。
  • 分配的内存块大小可以是任意字节数,但通常是数据类型大小的倍数。

2. calloc:分配并初始化内存块

calloc 是 “clear allocation” 的缩写,用于在堆区分配指定数量的内存块,并将每个字节初始化为零。

函数原型:

void* calloc(size_t num, size_t size);
  • num:要分配的元素数量。
  • size:每个元素的大小(以字节为单位)。
  • 返回值:成功时返回指向分配内存块的指针,失败时返回 NULL

示例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int* ptr;
    int n = 5;

    // 分配并初始化内存
    ptr = (int*)calloc(n, sizeof(int));

    if (ptr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 使用分配的内存
    for (int i = 0; i < n; i++) {
        ptr[i] = i + 1;
    }

    // 打印数组
    for (int i = 0; i < n; i++) {
        printf("%d ", ptr[i]);
    }

    // 释放内存
    free(ptr);

    return 0;
}

注意事项:

  • calloc 分配的内存块中的内容会被初始化为零,适合用于需要初始化内存的场景。
  • calloc 的参数是元素数量和每个元素的大小,而不是总字节数。

3. realloc:重新分配内存块

realloc 是 “reallocate” 的缩写,用于调整已分配内存块的大小。它可以扩展或缩小内存块,并保留原有数据(如果新大小大于原大小)。

函数原型:

void* realloc(void* ptr, size_t size);
  • ptr:指向已分配内存块的指针。
  • size:新的内存块大小(以字节为单位)。
  • 返回值:成功时返回指向新分配内存块的指针,失败时返回 NULL

示例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int* ptr;
    int n = 5;

    // 分配内存
    ptr = (int*)malloc(n * sizeof(int));

    if (ptr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 使用分配的内存
    for (int i = 0; i < n; i++) {
        ptr[i] = i + 1;
    }

    // 重新分配内存
    n = 10;
    ptr = (int*)realloc(ptr, n * sizeof(int));

    if (ptr == NULL) {
        printf("内存重新分配失败\n");
        return 1;
    }

    // 使用新分配的内存
    for (int i = 5; i < n; i++) {
        ptr[i] = i + 1;
    }

    // 打印数组
    for (int i = 0; i < n; i++) {
        printf("%d ", ptr[i]);
    }

    // 释放内存
    free(ptr);

    return 0;
}

注意事项:

  • realloc 可以扩展或缩小内存块,但可能会导致内存块的重新分配和数据的复制。
  • 如果 realloc 失败,返回 NULL,但原内存块不会被释放,需要手动处理。

总结

  • malloc:用于分配未初始化的内存块。
  • calloc:用于分配并初始化为零的内存块。
  • realloc:用于调整已分配内存块的大小,保留原有数据。

在实际编程中,根据具体需求选择合适的内存分配函数,可以提高程序的效率和可靠性。同时,注意在使用完动态分配的内存后,及时调用 free 函数释放内存,避免内存泄漏。


http://www.kler.cn/news/337812.html

相关文章:

  • Modern CMake 简明教程(5)- 安装
  • Redis篇(面试题 - 连环16炮)(持续更新迭代)
  • 【笔记】I/O总结王道强化视频笔记
  • WSL--安装各种软件包
  • 《Linux从小白到高手》进阶实操篇:Linux找回Root用户密码
  • 掌握这17个Python自动化操作,简化你的日常工作流程,提升工作效率!
  • FDS-112 土壤盐分传感器 三针 自带温度补偿功能
  • 【爬虫】网站反debugger、内存爆破以及网站限制开发者工具
  • 教培机构如何向知识付费转型
  • github命令行管理工具推荐
  • kubernetes基础操作(pod生命周期)
  • mysql系统常用参数查询命令
  • Python去除字符串中的括号
  • 网文:孙子兵法看人性
  • ACT调试pycharm报错
  • 手写mybatis之数据源池化技术实现
  • 高级算法LLM大模型算法特训:带你转型AI大模型算法工程师
  • 二维数组的旋转与翻转(C++)(上(这只是简单讲解))
  • 脑机接口技术的未来与现状:Neuralink、机械手臂与视觉假体的突破
  • STM32外设应用知识详解