【C语言】malloc()函数详解(动态内存开辟函数)

举报
修修修也 发表于 2024/03/30 14:11:56 2024/03/30
【摘要】 C语言库函数malloc()函数的功能,参数,返回值及具体使用详解.

一.malloc()函数简介

我们先来看一下cplusplus.com - The C++ Resources Network 网站上malloc()函数的基本信息:

1.函数功能

可以看到,malloc()函数的功能是:向内存申请一块连续可用的空间,并返回指向块开头的指针.

2.函数参数

该函数有1个参数,是:

void* malloc (size_t size);

📌size_t size

参数的类型size_t(无符号整型),它表示要开辟的内存块的大小(以字节为单位),它的作用是告诉函数需要动态开辟多少个字节的空间.

在使用malloc时,一般参数传递的形式为(sizeof(要开辟的变量名)*要开辟的个数).

当然也可以直接给malloc传一个具体的数字作为参数,比如:malloc(40);这样malloc()函数就会开辟一个大小为40字节的空间给你使用.

3.函数返回值

函数的返回值类型void*(无类型指针),它的作用是在函数运行结束后返回给主函数动态开辟好的空间块的首地址,以便后续进行对这块内存空间的使用.

但要注意:如果在malloc()函数在开辟的过程中遇到了无法分配请求的内存块(即遇到了开辟失败的情况),那么就会返回一个NULL指针,因此malloc的返回值一定要进行检查!

4.函数头文件

该函数包含在头文件<stdlib.h>中.

5.函数生成空间(与calloc区别)

malloc()函数生成的空间内容是不会初始化的!

我们可以调试一下,打开监视窗口查看malloc()函数开辟的内存空间存放的内容:

可以看到,malloc()函数开辟的内存空间中存放的值是随机值,我们后续需要初始化后再进行使用.

而与之相对的另一个动态开辟函数calloc则会开辟一段已经全部初始化为0的空间:

二.malloc()函数的具体使用

malloc()函数的使用场景是:当我们想要使用一块连续的可以按需求调节大小的空间时,我们可以使用malloc()函数来实现这一诉求.

需要特别注意的是!使用malloc()函数动态开辟的内存空间是必须使用free()函数释放还给操作系统的,如果不释放的话就会造成内存泄漏!

内存泄漏:如果动态开辟的内存没有被释放,那么这些内存就会一直占用系统资源,从而导致内存泄漏。内存泄漏会导致程序运行速度变慢,甚至崩溃。

1.使用malloc()函数完成动态整型数组空间的开辟

如下,我们使用malloc()函数开辟一个有10个元素的整型数组:

我们给malloc()函数传入:sizeof(int)*10(即10个整型大小的字节数,即40byte).

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>

int main()
{
    int* p = (int*)malloc(sizeof(int) * 10); //动态开辟内存空间
    if (p != NULL) //检验动态开辟空间是否成功
    {
        int i = 0;
        for (i = 0; i < 10; i++) //如果成功,则给这10个整型赋值
        {
            *(p + i) = i;
            printf("%d\n", *(p + i));
        }
    }
    else
    {
        printf("%s\n", strerror(errno)); //如果失败,则打印失败错误信息
        return 0; //失败则不需要进行下面的释放和置空操作了,可以直接退出
    }

    free(p); //使用完后向系统归还动态开辟的内存空间
    p = NULL; //将p指针置为空,避免p成为野指针

    return 0;
}

在vs编译器中运行查看结果:

可见malloc()函数成功的开辟出了40个字节的空间来存放这10个整型数据元素.

而如果我们将动态内存开辟的空间大小改为INT_MAX(即2147483647),动态内存开辟就会失败,并告诉我们原因:

这里还有需要注意的点是,用malloc()函数申请0个空间是一种未定义的行为,不同的编译器会有不同的解决方法,但这样的操作的没有实际意义的.


2.使用malloc()函数完成动态结构体空间的开辟

创建好结构体变量后,我们给malloc()函数传入:sizeof(PeoInfo)*3(即3个PeoInfo类型大小的字节数).

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>

//人的信息-结构体
typedef struct PeoInfo
{
    char name[20];
    int age;
    char sex[5];
    char addr[20];
    char tele[11];//电话11位,留一位给'\0';
}PeoInfo;

typedef struct Contact
{
    PeoInfo* data; //存放人的信息
    int sz; //用来记录当前已经存放的信息的个数
    int capacity; //记录当前通讯录的最大容量
}Contact;

int main()
{
    Contact con;
    PeoInfo* ptr = (PeoInfo*)malloc(sizeof(PeoInfo)*3); //动态开辟空间
    if (ptr == NULL) //如果开辟失败,则打印错误原因
    {
        perror("InitContact::malloc");
        return;
    }
    free(ptr); //使用完后向系统归还动态开辟的内存空间
    ptr = NULL; //将p指针置为空,避免p成为野指针
    return 0;
}

在vs编译器中查看结果:

可见malloc()函数成功的开辟出了3个PeoInfo类型的空间来存放这3个元素.


结语

希望这篇malloc()函数详解能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。