动态内存函数:malloc的使用详解

举报
念君思宁 发表于 2023/02/12 20:24:34 2023/02/12
【摘要】 动态内存函数:malloc的使用详解

各个动态内存函数的使用条件!

1.动态内存的分配:

对于下列代码,所申请的空间是固定的:


  1. int num=10; //向内存申请4个字节

  2. int arr[10]={0}; //向内存申请40个字节

但是对于数组arr[10],已经申请40个字节的空间,如果部分没有使用就会造成浪费,或者有可能不够,就得使用更多的空间,所以动态内存分配的存在,显得非常重要!!

对于上述的开辟的空间的方式,有两个特点:

1.空间开辟的大小是固定的!!

2.数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配!!

但是,对于空间的需求,不仅仅时上述的情况,有时候,我们需要的空间大小,在程序运行的时候才能知道,那数组的编译时 ,开辟空间的方式就不能满足了!!

因此,基于上述种种原因。动态内存开辟显得尤为重要!!

下面进入:malloc动态内存开辟函数的详解!!

使用语法为:

void* malloc (size_t size)

size_t  是指:无符号的整型!!

size: 是指:大小,单位为字节

malloc 这个函数,向内存申请size个字节的空间,然后将申请的空间的起始地址返回!!

但是,上述的返回类型为什么是:void*类型呢??

  原因在于:只申请了size个字节的大小,并没有指明内存中放什么类型的数据!导致不知道用什么类型的指针来维护这个空间合适!!所以,返回的是void* 的指针!!

malloc 函数所需要的头文件为: #include <stdlib.h>


下面请看,使用案列:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
	int arr[10] = { 0 };  //向内存申请了10*4=40个字节的空间
	void* p = malloc(40);  //40字节
}

在上面的void* p = malloc(40)中,向内存申请了40个子节的空间!malloc会返回一个地址,将这个地址放到void*的指针里面!!

将malloc 开辟的40个空间里面放入10个整型!需要强制类型转化;代码书写情况为:

	int* p = (int*)malloc9(40);

这个就是需要将malloc开辟的void*类型的指针强制类型转换为:int *类型的指针!!

但是,对于malloc开辟空间失败,则会返回一个空指针(NULL)!一般情况下,开辟空间都会成功,很少有失败的案列(开辟一个很大的空间,可能会失败)


开辟空间的代码使用情况:

 
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
 
int main()
{
	//int arr[10]={0};  //向内存申请40个字节的空间
	
	int* p = (int*)malloc(40);
	int* ptr = p;
	if (ptr == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//使用
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*ptr = i;
		ptr++;
	}
	
	//释放
	free(p);  
	//关于free()的用法,大家先不用知道,在后续会有讲解!!
	p = NULL;
}

上述的代码,仅仅是为了向各位老铁介绍一下如何使用malloc函数!并不做其他作用,所以,在最后,笔者也没有进行用printf函数来打印出来代码!!

1.int* ptr = p;  如果不这样进行,在后面会有进行p++的部分,此时,p已经不再是初始地址,在进行free(p)会报错!!对于free()函数,只需要知道是释放动态开辟空间内存的就可以,其他的在后续博客有更新!!

 对于malloc 是C语言提供的一个动态内存开辟函数!

void* malloc (size_t size)

这个函数向内存申请一块连续可用的空间,并且返回指向这块空间的指针!!

1.如果开辟成功,则返回一个指向这个开辟好空间的起始地址

2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查!!

3.返回值的类型为:void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候,由使用者自己决定!!

4.如果参数size为0,malloc的行为是标准为定义的,取决于编译器!!

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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