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

本文详细介绍了C语言中的malloc()函数,包括其功能、参数、返回值、头文件以及与calloc的区别。同时讲述了如何使用malloc动态开辟整型数组和结构体空间,以及内存管理的重要性,提醒读者注意内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 🦄个人主页:修修修也

🎏所属专栏:C语言

⚙️操作环境:Visual Studio 2022


目录

一.malloc()函数简介

1.函数功能

2.函数参数

📌size_t size

3.函数返回值

4.函数头文件

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

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

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

2.使用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()函数开辟的内存空间存放的内容:

不会调试使用监控查看程序运行状况的可以移步:

【实用调试技巧】总是找不到Bug?手把手教你在vs2022中调试程序https://blog.csdn.net/weixin_72357342/article/details/133823086?spm=1001.2014.3001.5502

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

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

想要了解更多关于calloc()函数的内容可以移步:

【C语言】calloc()函数详解(动态内存开辟函数)https://blog.csdn.net/weixin_72357342/article/details/133975677我们在这篇就不多赘述了,只简述他们俩在开辟空间方面的区别.


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

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

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

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

对free()函数还不太了解的可以移步这里:

【C语言】free()函数详解(动态内存释放函数)https://blog.csdn.net/weixin_72357342/article/details/133975657

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()函数详解能对大家有所帮助,欢迎大佬们留言或私信与我交流.

有关更多动态开辟相关知识可以移步:

【C语言】内存的动态分配与释放https://blog.csdn.net/weixin_72357342/article/details/134099965?spm=1001.2014.3001.5502

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

相关文章推荐

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

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

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

【C语言】free()函数详解(动态内存释放函数)

【C语言】memcpy()函数

【数据结构实战项目】C语言实现数据结构顺序表万字详解(附完整运行代码)

【实用编程技巧】不想改bug?初学者必须学会使用的报错函数assert!(断言函数详解)


 


C语言动态内存开辟相关库函数思维导图:

`malloc` 是 C 语言中用于动态分配内存的函数。它的原型如下: ```c void* malloc(size_t size); ``` `malloc` 函数接受一个 `size_t` 类型的参数 `size`,表示需要分配的字节数。它在堆(heap)上分配一块大小为 `size` 字节的连续内存空间,并返回一个指向该内存空间起始地址的指针。 需要注意的是,`malloc` 分配的内存是未初始化的,其中的内容是不确定的。如果需要初始化分配的内存,可以使用 `calloc` 函数。 使用 `malloc` 分配内存的一般步骤如下: 1. 在程序中包含 `<stdlib.h>` 头文件。 2. 调用 `malloc` 函数,并传入需要分配的字节数作为参数。 3. 检查返回的指针是否为 `NULL`,以判断是否分配成功。 4. 使用返回的指针访问分配的内存空间。 5. 在使用完分配的内存后,使用 `free` 函数释放内存。 下面是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> int main() { int* ptr; int numElements = 5; // 分配大小为 numElements * sizeof(int) 字节的内存空间 ptr = (int*)malloc(numElements * sizeof(int)); if (ptr == NULL) { printf("内存分配失败\n"); return 1; } // 使用分配的内存 for (int i = 0; i < numElements; i++) { ptr[i] = i + 1; } // 打印分配的内存 for (int i = 0; i < numElements; i++) { printf("%d ", ptr[i]); } // 释放内存 free(ptr); return 0; } ``` 以上代码演示了使用 `malloc` 分配内存并初始化的过程,然后访问和释放分配的内存空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修修修也

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值