C语言中动态内存分配malloc、calloc和realloc函数解析

C语言中动态内存分配函数解析

在C语言中,动态内存分配是一种重要的技术,它允许程序在运行时动态地分配和释放内存。C语言提供了几个函数来实现动态内存分配,其中包括malloccallocrealloc函数。本文将详细解析这三个函数的用法和区别。

1. malloc函数

malloc函数用于在堆上分配指定大小的内存块。它的函数原型如下:

void* malloc(size_t size);
  • size参数表示要分配的内存块的大小,以字节为单位。
  • malloc函数返回一个指向分配内存块的指针,如果分配失败,则返回NULL

下面是一个使用malloc函数的示例:

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

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

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

    if (ptr == NULL) {
        printf(\"内存分配失败\
\");
        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函数分配了一个包含5个整数的内存块,并使用指针ptr指向该内存块。然后,我们使用循环将1到5的整数存储到分配的内存块中,并打印结果。最后,我们使用free函数释放了分配的内存块。

2. calloc函数

calloc函数用于在堆上分配指定数量和大小的连续内存块,并将其初始化为零。它的函数原型如下:

void* calloc(size_t num, size_t size);
  • num参数表示要分配的内存块的数量。
  • size参数表示每个内存块的大小,以字节为单位。
  • calloc函数返回一个指向分配内存块的指针,如果分配失败,则返回NULL

下面是一个使用calloc函数的示例:

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

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

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

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

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

    // 释放内存块
    free(ptr);

    return 0;
}

在上面的示例中,我们使用calloc函数分配了一个包含5个整数的内存块,并将其初始化为零。然后,我们打印了分配的内存块中的内容,并使用free函数释放了分配的内存块。

3. realloc函数

realloc函数用于重新分配已经分配的内存块的大小。它的函数原型如下:

void* realloc(void* ptr, size_t size);
  • ptr参数是一个指向已分配内存块的指针。
  • size参数表示重新分配后的内存块的大小,以字节为单位。
  • realloc函数返回一个指向重新分配内存块的指针,如果分配失败,则返回NULL

下面是一个使用realloc函数的示例:

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

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

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

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

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

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

    if (ptr == NULL) {
        printf(\"内存分配失败\
\");
        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函数分配了一个包含5个整数的内存块,并打印了分配的内存块中的内容。然后,我们使用realloc函数重新分配了内存块的大小为10个整数,并使用循环将1到10的整数存储到重新分配的内存块中,并打印结果。最后,我们使用free函数释放了分配的内存块。

总结

  • malloc函数用于分配指定大小的内存块。
  • calloc函数用于分配指定数量和大小的连续内存块,并将其初始化为零。
  • realloc函数用于重新分配已经分配的内存块的大小。

以上是关于C语言中动态内存分配函数malloccallocrealloc的详细解析,希望对你有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中动态内存分配malloc、calloc和realloc函数解析 - Python技术站

(0)
上一篇 2023年8月2日
下一篇 2023年8月2日

相关文章

  • android设置edittext不可编辑

    android设置edittext不可编辑 在Android开发中,我们经常需要使用EditText来进行用户输入的操作。但是有些时候,我们可能需要将EditText设置为不可编辑的状态,比如展示一些静态的文本信息。那么该如何设置呢? 设置EditText为不可编辑的方法 我们可以使用EditText的setFocusable()和setFocusableI…

    其他 2023年3月28日
    00
  • 华为荣耀3X畅玩版开发者选项在哪里 如何设置

    下面我将为你详细讲解如何在华为荣耀3X畅玩版中开启开发者选项并进行设置。 1. 打开开发者选项 首先,要设置开发者选项,需要先打开开发者选项。具体操作步骤如下: 1.打开手机的设置菜单。 2.向下滑动,找到“关于手机”的选项,并点击进入。 在“关于手机”页面中,找到“版本号”选项,并连续点击七次,直到出现提示“开启了开发者选项”。 返回上一级,你会发现多出了…

    other 2023年6月26日
    00
  • 对ubuntu操作系统进行彻底优化

    对Ubuntu操作系统进行彻底优化 Ubuntu是一个备受欢迎的Linux操作系统,拥有超过2500万用户。但是默认安装的Ubuntu系统可能不是最适合每个用户的,因此,在本文中,我们将提供一些有用的技巧,以对Ubuntu系统进行彻底优化。 一、更新Ubuntu系统 首先,确保你的Ubuntu系统已经更新到最新版本。终端中可以使用以下命令进行更新: sudo…

    其他 2023年3月29日
    00
  • 如何批量修改文件后缀名(任何文件的扩展名)?

    如何批量修改文件后缀名(任何文件的扩展名)? 有时候我们需要批量修改文件的后缀名,这可以通过以下步骤来完成: 步骤一:备份文件 在进行任何文件操作之前,建议先备份文件,以防止意外情况发生。 步骤二:选择合适的工具 有多种方法可以批量修改文件后缀名,下面介绍两种常用的方法。 方法一:使用命令行 打开命令行终端。 切换到包含要修改后缀名的文件的目录。 使用以下命…

    other 2023年8月5日
    00
  • Python全栈之作用域和闭包

    Python全栈之作用域和闭包攻略 作用域(Scope) 在Python中,作用域是指变量的可访问性和可见性范围。Python中有三种作用域:全局作用域、局部作用域和内建作用域。 全局作用域 全局作用域是在整个程序中都可访问的作用域。在全局作用域中定义的变量可以在程序的任何地方使用。 x = 10 # 全局变量 def foo(): print(x) # 可…

    other 2023年7月28日
    00
  • 使用wireshark分析tls

    使用Wireshark分析TLS TLS(Transport Layer Security)是一种加密通信协议,用于保护互联网上的数据传输安全。在这篇文章中,我们将介绍如何使用Wireshark分析TLS通信,并了解有关TLS协议的更多信息。 确保TLS数据包捕获 在使用Wireshark分析TLS通信之前,我们需要确保我们已经捕获了TLS数据包。您可以使用…

    其他 2023年3月29日
    00
  • qmenu与qmenubar

    qmenu与qmenubar Qt是一个功能强大的跨平台应用程序开发框架。它提供了一系列的UI控件来简化应用程序的开发。其中包括QMenu和QMenuBar。 QMenu是一个用于在应用程序界面上创建弹出菜单的小部件。它可以包含各种动作项,例如操作、复选框、单选按钮以及分隔符等。QMenu很容易使用,可以通过QAction、QIcon和键盘快捷键创建动作项。…

    其他 2023年3月28日
    00
  • 在MyBatisPlus中使用@TableField完成字段自动填充的操作

    当我们向数据库中插入一条记录或更新一条记录时,往往需要记录一些额外的信息,例如创建时间、更新时间、创建人和更新人等,在MyBatisPlus中可以通过@TableField注解来完成这些字段的自动填充,具体步骤如下: 在实体类中定义需要自动填充的字段,并在字段上添加@TableField注解,指定填充类型和填充策略,如下所示: public class Us…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部