C语言实现内存相关操作函数(memset、memcmp、memcpy、memmove)

C语言实现内存相关操作函数(memset、memcmp、memcpy、memmove)
目录:

1.memset()函数
2.memcmp()函数
3.memcpy()函数
4.memmove()函数

一、memset()函数
(1)函数原型:void my_memset(void ptr, int value, size_t num);**
(2)功能:初始化内存空间
(3)代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>
//memset函数
void* my_memset(void* ptr, int value, size_t num)
{
	//参数有效性检查
	assert(ptr != NULL);
	char* tptr = (char*)ptr;
	//初始化内存
	while (num-- != 0)
	{
		*tptr++ = value;
	}
	return ptr;
}
int main()
{
	int ar[10];
	my_memset(ar, 0, sizeof(int) * 10);
	for (int i = 0; i < 10; ++i)
	{
		printf("%d ", ar[i]);
	}
	printf("\n");
	return 0;
}

(4)运行截图:
在这里插入图片描述
二、memcmp()函数
(1)函数原型:int my_memcmp(const void ptr1, const void ptr2, size_t num);**
(2)功能:对内存中的内容进行比较
(3)代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>
//memcmp函数
int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{
	//参数有效性检查
	assert(ptr1 != NULL && ptr2 != NULL);
	//保护参数
	const char* tptr1 = (char*)ptr1;
	const char* tptr2 = (char*)ptr2;
	int ret = 0;
	//比较
	while (num-- != 0)
	{
		ret = *tptr1 - *tptr2;
		if (ret != 0)
		{
			break;
		}
		tptr1++;
		tptr2++;
	}
	return ret;
}
int main()
{
	char* ar = "hello";
	char* br = "hella";
	int flag = my_memcmp(ar, br, sizeof(char) * 5);
	printf("flag = %d", flag);
	return 0;
}

(4)运行截图:
在这里插入图片描述
这里输出的值是14,原因是‘o’的ASCII码比‘a’的ASCII码大14。
三、memcpy()函数
(1)函数原型:void my_memcpy(void dest, const void* src, size_t num);**
(2)功能:内存拷贝
(3)代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>
//memcpy函数
void* my_memcpy(void* dest, const void* src, size_t num)
{
	//参数有效性检查
	assert(dest != NULL && src != NULL);
	//保护参数
    char* pdest = (char*)dest;
    const char* psrc = (const char*)src;
	//对内存中的内容进行拷贝
	while (num-- != 0)
	{
		*pdest++ = *psrc++;
	}
	return dest;
}
int main()
{
	int ar[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int br[10];
	my_memcpy(br, ar, sizeof(int) * 10);
	for (int i = 0; i < 10; ++i)
	{
	    printf("%d ", br[i]);
	}
	return 0;
}

(4)运行截图:
在这里插入图片描述
四、memmove()函数
(1)函数原型:void my_memmove(void dest, const void* src, size_t num);**
(2)功能:与momcpy函数相似,但是mommove函数考虑了内存重叠问题
(3)代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>
//memmove函数
void* my_memmove(void* dest, const void* src, size_t num)
{
	//参数有效性检查
	assert(dest != NULL && src != NULL);
	//保护参数
	char* pdest = (char*)dest;
	const char* psrc = (const char*)src;
	//对内存中的内容进行拷贝
	if (psrc >= pdest || pdest >= psrc + num)
	{
		while (num-- != 0)
		{
			*pdest++ = *psrc++;
		}
	}
	//如果发生内存重叠,则从后往前拷贝内存中的内容
	else
	{
		pdest = pdest + num - 1;
		psrc = psrc + num - 1;
		while (num-- != 0)
		{
			*pdest-- = *psrc--;
		}
	}
	return dest;
}
int main()
{
	char str1[20] = "abcdefghi";
	char str2[] = "ABCDEF";
	printf("str1 = %s\n", str1);
	printf("str2 = %s\n", str2);
	my_memmove(str1, str2, 6);
	printf("str1 = %s\n", str1);
	my_memmove(str1 + 2, str1, 5);
	printf("str1 = %s\n", str1);
	return 0;
}

(4)运行截图:在这里插入图片描述
有小伙伴可能会疑惑,既然memcpy函数和memmove函数作用相一致,那为什么还要多提出一个memmove函数呢?原因是memmove函数考虑了内存重叠的问题,而memcpy函数并没有考虑这一问题(关于什么是没存重叠问题,请读者上网搜索查看)。当程序中不需要考虑内存重叠的问题时,建议使用memcpy函数,而当程序中需要考虑内存重叠问题时,建议使用memmove函数。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
引用: 结果发现:memcpy在拷贝数据时与strcpy和strncpy不同的是memcpy遇到 '\0' 是不会停止拷贝到。 引用: 知识点4:memcpy()函数的模拟:void* my_memcpy(void* dst, const void* src, size_t count) { ... } 引用: 代码演示:memcpy(arr2, arr1, 6); memsetmemcpyC语言中的两个函数memset函数用于将一块内存区域的每个字节都设置为指定的值,而memcpy函数用于将一块内存区域的数据拷贝到另一块内存区域。 具体来说,memset函数的原型为void *memset(void *s, int c, size_t n),其中s是指向内存区域的指针,c是要设置的值,n是要设置的字节数。该函数会将s所指向的内存区域的每个字节都设置为c。 而memcpy函数的原型为void *memcpy(void *dest, const void *src, size_t n),其中dest是目标内存区域的指针,src是源内存区域的指针,n是要拷贝的字节数。该函数会将src所指向的内存区域的数据拷贝到dest所指向的内存区域。 需要注意的是,memcpy在拷贝数据时,不会像strcpy和strncpy那样遇到 '\0' 就停止拷贝,而是会一直拷贝下去直到拷贝完指定的字节数。这是memcpy与strcpy和strncpy的一个区别。 在引用中给出了一个自定义的my_memcpy函数的示例代码,该函数模拟了memcpy函数功能。 在引用中给出了一个使用memcpy函数的示例代码,该代码将字符串"abc\0def"的前6个字节拷贝到另一个字符数组中。 综上所述,memsetmemcpyC语言中用于操作内存的两个函数,分别用于设置内存区域的值和拷贝内存区域的数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [内存函数:memcpymemmove、memcmpmemset(超详细讲解,小白一看就懂!!!!)](https://blog.csdn.net/weixin_45031801/article/details/127481057)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值