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

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

1.动态内存的分配:

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

int num=10;       //向内存申请4个字节
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的行为是标准为定义的,取决于编译器!!

猜你喜欢

转载自blog.csdn.net/weixin_64308540/article/details/127315250