了解malloc的常见用法

一、malloc函数的介绍和用法

malloc函数是C语言中的一种动态内存分配函数,它的声明在stdlib.h中,函数原型如下:

void* malloc(size_t size);

其中size为申请内存的大小,返回值是指向void类型的指针,指向申请的内存起始地址。

使用malloc函数申请内存可以用于需要动态分配内存的程序,比如链表、数组等等。

二、malloc函数的基本使用

下面是一个简单的基于C语言的malloc函数使用示例:

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

int main() {
    int *ptr;
    int num, i;
    
    printf("请输入要申请的整数个数:");
    scanf("%d", &num);
    
    ptr = (int*) malloc(num * sizeof(int)); // 用malloc申请一段内存空间,大小为num个整数
    if (ptr == NULL)  // 如果申请失败,输出提示信息
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    
    printf("请输入%d个整数:\n", num);
    for (i = 0; i < num; i++)   // 输入num个整数
    {
        scanf("%d", ptr + i);
    }
    
    printf("你输入的%d个整数是:\n", num);
    for (i = 0; i < num; i++)   // 输出num个整数
    {
        printf("%d ", *(ptr + i));
    }
    
    free(ptr);  // 释放内存空间
    
    return 0;
}

该实例中为了在内存中存储num个整数,使用了malloc函数,成功申请内存后,将返回一个指向int类型的指针,在使用过程中需要注意:

  • 及时释放内存空间,避免内存泄漏
  • 必要时判断申请内存的指针是否为空,以避免程序崩溃

三、calloc函数和realloc函数

malloc是C语言中常用的内存分配函数,但实际上C语言还有其他两个常用的动态内存分配函数:calloc函数和realloc函数。

与malloc函数不同,calloc函数在分配内存时回把分配的内存空间清零。下面是一个基于C语言的calloc函数使用示例:

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

int main() {
    int *ptr;
    int num, i;
    
    printf("请输入要申请的整数个数:");
    scanf("%d", &num);
    
    ptr = (int*) calloc(num, sizeof(int));  // 用calloc申请一段内存空间,大小为num个整数
    if (ptr == NULL)  // 如果申请失败,输出提示信息
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    
    printf("请输入%d个整数:\n", num);
    for (i = 0; i < num; i++)   // 输入num个整数
    {
        scanf("%d", ptr + i);
    }
    
    printf("你输入的%d个整数是:\n", num);
    for (i = 0; i < num; i++)   // 输出num个整数
    {
        printf("%d ", *(ptr + i));
    }
    
    free(ptr);  // 释放内存空间
    
    return 0;
}

calloc与malloc实际上用法是类似的,不过可以看到,calloc的第一个参数n表示要申请的内存块数,而不是malloc的样板参数。第二个参数size是内存块的大小,返回值是一个指向void类型的指针。

realloc函数的作用是重新分配内存空间,即在原内存空间扩展或收缩一定的空间,下面是一个基于C语言的realloc函数使用示例:

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

int main() {
    int *ptr;
    int num, i;
    
    printf("请输入要申请的整数个数:");
    scanf("%d", &num);
    
    ptr = (int*) malloc(num * sizeof(int)); // 用malloc申请一段内存空间,大小为num个整数
    if (ptr == NULL)  // 如果申请失败,输出提示信息
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    
    printf("请输入%d个整数:\n", num);
    for (i = 0; i < num; i++)   // 输入num个整数
    {
        scanf("%d", ptr + i);
    }
    
    printf("你输入的%d个整数是:\n", num);
    for (i = 0; i < num; i++)   // 输出num个整数
    {
        printf("%d ", *(ptr + i));
    }
    
    printf("\n请输入新的整数个数:");
    scanf("%d", &num);
    
    ptr = (int*) realloc(ptr, num * sizeof(int)); // 重新申请内存空间
    if (ptr == NULL)  // 如果申请失败,输出提示信息
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    
    printf("请输入%d个整数:\n", num);
    for (i = 0; i < num; i++)   // 输入num个整数
    {
        scanf("%d", ptr + i);
    }
    
    printf("你输入的%d个整数是:\n", num);
    for (i = 0; i < num; i++)   // 输出num个整数
    {
        printf("%d ", *(ptr + i));
    }
    
    free(ptr);  // 释放内存空间
    
    return 0;
}

可以看到,在使用realloc函数时,需要传入原内存空间的指针和新的内存空间大小(即分配的字节数),如果操作成功,那么该函数会返回新的指针值,指向从原始内存中复制过来的数据,原始内存将被释放,以避免内存泄漏。

四、动态内存分配的优缺点

使用动态内存分配功能的优点:

  • 可以更加灵活地管理内存,在程序的运行过程中只有需要内存时才会得到申请,在不需要时及时释放。
  • 可以节省程序的内存空间,增强程序的可读性和可维护性。

使用动态内存分配功能的缺点:

  • 相较于静态内存分配,需要更多的计算机处理时间。
  • 应用程序必须负责释放所使用的动态内存,否则会导致内存泄漏。
  • 动态内存分配过多会导致内存碎片问题。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/159183.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-19 19:00
下一篇 2024-11-19 19:00

相关推荐

  • Python常见异常类型解析

    本文将阐述Python常见异常类型,包括其定义、分类及处理方法。 一、语法错误 语法错误是指在Python代码编写过程中出现的错误,这是一种最常见的错误类型。当Python解释器无…

    编程 2025-04-27
  • Grep 精准匹配:探究匹配原理和常见应用

    一、什么是 Grep 精准匹配 Grep 是一款在 Linux 系统下常用的文本搜索和处理工具,精准匹配是它最常用的一个功能。Grep 精准匹配是指在一个文本文件中查找与指定模式完…

    编程 2025-04-25
  • MySQL常见面试题

    一、基础知识 1、MySQL的优点和缺点 MySQL是一个开源的关系型数据库管理系统,拥有以下优点: (1)开源免费,可以节省成本; (2)支持多种操作系统; (3)易于使用和管理…

    编程 2025-04-24
  • 常见激活函数详解

    一、Sigmoid函数 Sigmoid函数是最经典的激活函数之一,具有将实数映射到(0, 1)的特性,其公式如下: def sigmoid(x): return 1 / (1 + …

    编程 2025-04-23
  • JTextField:Java中常见的文本输入框控件

    JTextField是Java Swing控件库中的一种常见的用于文本输入的控件,它提供了许多实用的特性与灵活的可扩展性。在本文中,我们将从多个方面对JTextField进行详细的…

    编程 2025-04-22
  • 详解stringutils.isempty的常见应用场景及内部实现

    一、简介 stringutils.isempty是Apache commons-lang3库中的一个实用函数,它用于判断一个字符串是否为空或者null。在实际开发中,经常需要对字符…

    编程 2025-04-02
  • 常见端口详解

    一、HTTP协议端口 HTTP协议端口为80。 HTTP协议(Hypertext Transfer Protocol,超文本传输协议)。主要用于Web浏览器和Web服务器之间的通信…

    编程 2025-02-24
  • React常见面试题详解

    一、React 生命周期 1、生命周期简介 React 生命周期是指 React 组件从实例创建到销毁的整个过程。其中包含挂载、更新和卸载三个阶段。 2、生命周期分类 React …

    编程 2025-02-05
  • 无锁编程中的常见技术

    一、读写锁(Read-Write Lock) 读写锁允许多个读取线程同时访问共享资源,只要没有线程试图对资源进行写操作。当有写操作时,所有的读取线程和写入线程都必须等待写入完成,然…

    编程 2025-02-05
  • new与malloc的区别和使用

    一、new和malloc的基本概念 new和malloc都是用于动态分配内存的函数。dynamic memory allocation是指在程序运行时动态分配内存,也称堆分配(he…

    编程 2025-01-27

发表回复

登录后才能评论