C语言基础语法第七章字符串 demo4_malloc(动态开辟内存空间) 、realloc(扩容内存)、memset(初始化内存)、free(释放内存,防止内存泄漏)

C语言基础语法第七章字符串 demo4_malloc(动态开辟内存空间) 、realloc(扩容内存)、memset(初始化内存)、free(释放内存,防止内存泄漏)

在C语言中,calloc、malloc、realloc和memset是用于内存管理和操作的函数。它们在以下方面有所区别:

1.malloc:
函数原型:void *malloc(size_t size);
作用:为一段内存分配空间,但不会对其进行初始化。
参数:size表示要分配的字节数。
返回值:如果分配成功,则返回指向分配内存的指针;如果分配失败,则返回NULL指针。
注意事项:malloc只分配内存,并不会初始化该内存。适用于需要分配内存但不需要立即设置初始值的情况。

2.realloc:
函数原型:void *realloc(void *ptr, size_t size);
作用:重新调整之前分配的内存块的大小。
参数:ptr是之前通过calloc或malloc分配的内存指针,size表示要重新分配的字节数。
返回值:如果重新分配成功,则返回指向重新分配内存的指针;如果分配失败,则返回NULL指针。
注意事项:realloc可以用于增加或减少之前分配的内存块的大小。如果新的大小大于原来的大小,额外的字节未初始化。
如果新的大小小于原来的大小,原有内存中的数据可能会丢失。

3.memset:
函数原型:void *memset(void *ptr, int value, size_t num);
作用:将一段内存块设置为指定的值。
参数:ptr表示要设置的内存块的指针,value表示要设置的值,num表示要设置的字节数。
返回值:返回指向内存块的指针。
注意事项:memset函数用于将一段内存块设置为指定的值,可以是0或任何其他值。

4.calloc:
函数原型:void *calloc(size_t num, size_t size);
作用:为一段内存分配空间,并将该内存块中的所有字节设置为零。参数:num表示要分配的元素数量,size表示每个元素的字节大小。返回值:如果分配成功,则返回指向分配内存的指针;如果分配失败,则返回NULL指针。
注意事项:calloc会分配一段新的内存,并初始化为零。适用于需要分配一块内存并将其清零的情况,比如数组。
适用于需要将一段内存清零或初始化为特定值的情况。

5.free:C 库函数 void free(void *ptr) 释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。
释放,防止内存泄露,防止悬挂指针(野指针的一种)

代码示例:

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
	char *p;//定义了一个野指针
	//*p = 'c';//对野指针进行操作危险 出现断错误
	p = (char *)malloc(1);//malloc动态开辟一个字节内存空间 这样p就有了具体的内存指向
	
	if (p == NULL)//通常养成好习惯对malloc返回值做NULL判断
	{
		printf("malloc error\n");
		exit(-1);
	}
	
	*p = 'c';//这样就没有了断错误
	printf("%c\n",*p);
	
	
	free(p);//动态开辟后重新指向,记得释放内存,不然存在内存泄露风险
	p = NULL;//free之后让指针指向NULL,防止悬挂指针(野指针的一种)
	
	p = (char *)malloc(12);//开辟12个字节的内存空间
	if (p == NULL) //通常养成好习惯对malloc返回值做NULL判断,申请失败了
	{
		printf("malloc error\n"); 
		exit(-1);
	}
	memset(p,'\0',12);//内存空间初始化
	printf("扩容前地址:%x\n",p);
	int len = strlen("longhaiyang1234566666789");//strlen计算有效长度不包括字符串结束标志'\0'
	
	int newlen = len - 12 + 1; //还要加上字符串末尾'\0'的大小
	
	p = realloc(p,newlen);//扩容内存空间
	
	printf("扩容后地址:%x\n",p);
	
	strcpy(p,"longhaiyang1234566666789");
	puts(p);
	printf("%s\n",p);
	puts("end");
	
	
	return 0;
}

/*
在C语言中,calloc、malloc、realloc和memset是用于内存管理和操作的函数。它们在以下方面有所区别:

calloc:

函数原型:void *calloc(size_t num, size_t size);
作用:为一段内存分配空间,并将该内存块中的所有字节设置为零。
参数:num表示要分配的元素数量,size表示每个元素的字节大小。
返回值:如果分配成功,则返回指向分配内存的指针;如果分配失败,则返回NULL指针。
注意事项:calloc会分配一段新的内存,并初始化为零。适用于需要分配一块内存并将其清零的情况,比如数组。

malloc:

函数原型:void *malloc(size_t size);
作用:为一段内存分配空间,但不会对其进行初始化。
参数:size表示要分配的字节数。
返回值:如果分配成功,则返回指向分配内存的指针;如果分配失败,则返回NULL指针。
注意事项:malloc只分配内存,并不会初始化该内存。适用于需要分配内存但不需要立即设置初始值的情况。

realloc:

函数原型:void *realloc(void *ptr, size_t size);
作用:重新调整之前分配的内存块的大小。
参数:ptr是之前通过calloc或malloc分配的内存指针,size表示要重新分配的字节数。
返回值:如果重新分配成功,则返回指向重新分配内存的指针;如果分配失败,则返回NULL指针。
注意事项:realloc可以用于增加或减少之前分配的内存块的大小。
如果新的大小大于原来的大小,额外的字节未初始化。
如果新的大小小于原来的大小,原有内存中的数据可能会丢失。

memset:

函数原型:void *memset(void *ptr, int value, size_t num);
作用:将一段内存块设置为指定的值。
参数:ptr表示要设置的内存块的指针,value表示要设置的值,num表示要设置的字节数。
返回值:返回指向内存块的指针。
注意事项:memset函数用于将一段内存块设置为指定的值,可以是0或任何其他值。
适用于需要将一段内存清零或初始化为特定值的情况。
总结:

calloc和malloc用于动态分配内存,calloc会将分配的内存块初始化为零,而malloc不会。
realloc用于重新调整之前分配的内存块的大小,可以增加或减少大小,但可能导致数据丢失。
memset用于将一段内存块设置为指定的值,常用于初始化
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值