【C语言】动态内存开辟的使用『malloc』_c语言动态分配内存malloc

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


👏malloc()函数

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

void* malloc (size_t size);

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

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

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

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

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

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

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

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

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

👏free()函数

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

void free (void* ptr);

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;
}

运行结果如下↓

0 1 2 3 4 5 6 7 8 9

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

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

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

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


👏calloc()

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

void* calloc (size_t num, size_t size);

为num元素数组分配一块内存,每个元素大小为字节长,并将其所有位初始化为零。有效的结果是分配一个(num*size)字节的零初始化内存块。

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

  • 参数

num → 要分配的元素数量。

size →  每个元素的大小。

size_t→  是无符号整型。

  • 返回值

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

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

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

calloc()函数和malloc()函数最大的区别无非就是:calloc()比malloc()就是参数多了一个,以及calloc()的函数会把每个字节进行初始化为全0,而malloc()不会对每个字节的内容进行初始化。calloc()会在返回地址之前把申请的空间的每个字节初始化全0的。

👏calloc()动态内存开辟使用

示例代码如下所示↓

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

运行结果如下↓

0 0 0 0 0 0 0 0 0 0

从这里我们可以发现,calloc()函数是帮我们进行了初始化为0的。那么如果我们把这里的代码改成是malloc()函数的形式看下会怎么样,其它不变来康康运行结果。

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

-842150451 → ⑩行

从这里我们可以知道 malloc() 函数并没有帮我们进行初始化。


👏realloc()

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

void* realloc (void* ptr, size_t size);

功能→改变由ptr指向的内存块的大小。

  • 参数

ptr → 是要调整内存的地址。

size → 内存块的新大小,以字节为单位。调整之后新的大小。

size_t→  是无符号整型。

返回值→一个指向重新分配的内存块的指针,它可以与ptr相同,也可以是一个新位置。
该指针的类型为void*,可以将其转换为所需的数据指针类型,以便可解引用。

注意→如果ptr是一个空指针,该函数的行为类似于malloc(),分配一个大小为字节的新块,并返回指向其开头的指针。 如下代码所示↓

int* p = (int*)malloc(10 * sizeof(int));
int* p = (int*)realloc(NULL,10 * sizeof(int));

实际上相当于等效。

👏realloc()动态内存开辟使用

示例代码如下所示↓

#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)


![img](https://img-blog.csdnimg.cn/img_convert/5c179dce797ffdb0e888bb6bde09166d.png)
![img](https://img-blog.csdnimg.cn/img_convert/b567feff7a749a8707d449a28ae8117b.png)
![img](https://img-blog.csdnimg.cn/img_convert/63eff62a51545c463b27e3c2aec65c79.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

(void)
{
	int* p = (int*)malloc(10 * sizeof(int));
	if (p == NULL)


[外链图片转存中...(img-ckYMfKE4-1715695425866)]
[外链图片转存中...(img-otPHEweg-1715695425866)]
[外链图片转存中...(img-xwBMMBd2-1715695425867)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值