【C语言】malloc 函数

时间:2022-12-26 16:01:21


那么这篇文章来介绍下动态内存开辟的函数之malloc()的使用,知道如何用了,那么就相当于学会了这个动态内存开辟。  


????malloc()函数

malloc()函数的声明,如下所示↓

void* malloc (size_t size);

【C语言】malloc 函数

分配一个大小为字节的内存块,返回一个指向该块开头的指针。

新分配的内存块的内容没有初始化,剩下不确定的值。

如果size为0,则返回值取决于特定的库实现(它可能是一个空指针,也可能不是),但返回的指针不应被解引用。 

size→内存块的大小,以字节为单位。

  • Size_t是一个无符号整型类型。

成功时,指向函数分配的内存块的指针。

该指针的类型始终是void*,可以将其转换为所需类型的数据指针,以便可解引用。

如果函数分配请求的内存块失败,则返回一个空指针NULL。

使用 malloc() 函数需要引头文件 #include<stdlib.h>

????free()函数

free()函数的声明,如下所示↓

void free (void* ptr);

【C语言】malloc 函数

ptr → 指针指向一个要释放内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果传递的参数是一个空指针,则不会执行任何动作。

该函数不返回任何值。 

实际上 free()  函数是专门用来作动态内存的释放或者回收的。注意:free()当中的 ptr 是指向栈区的空间的,如果你存放堆区空间的话是属于未定义的。

当我们回收完成之后,最好把 ptr 当中的参数置成为 NULL,这样它就找不到那块原来的空间了。

使用 free() 函数需要引头文件 #include<stdlib.h>

????malloc()动态内存开辟使用 

示例代码如下所示↓

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)
{
perror("main:");//perror() - 打印错误信息
}
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;//初始化赋值
printf("%d\n", p[i]);//相当于数组打印元素
}
//回收内存空间
free(p);
p = NULL;
return 0;
}

【C语言】malloc 函数

运行结果如下↓

0 1 2 3 4 5 6 7 8 9 

有没有发现其实和数组的访问是一模一样的,只不过一个是在栈区上,这个是在堆区上。

那如果是 malloc() 函数返回的是空指针的情况n,我们只需要把malloc()内存块空间改变下即可。如下↓

int* p = (int*)malloc(1000000000000000 * sizeof(int));

那么此时的运行结果就是→Not enough space(没有足够的空位)是实际上也就是内存空间。