C语言内存操作函数,memcpy的使用和模拟实现,memmove的使用和模拟实现,memcmp的使用,memset的使用。

文章详细介绍了C语言中用于内存操作的四个关键函数:memcpy用于安全地拷贝内存块,memmove特别在于可以处理重叠内存区域,memcmp用于比较内存块内容,memset则用于设置内存区域的值。每个函数的使用示例和模拟实现均被提供。
摘要由CSDN通过智能技术生成

1.memcpy

函数原型:

void *memcpy( void *dest, const void *src, size_t count );
  • void *dest 目标数据首元素地址
  • const void *src 源数据(需要拷贝过去的数据)
  • size_t count 需要拷贝数据的字节大小
  • void *memcpy 拷贝结束后,返回目标数据的起始地址

函数作用: 拷贝 count 个字节的数据从源数据起始地址到目标空间。

函数的使用

#include <stdio.h>
#include <string.h>

int main() {

	int nums1[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
	int nums2[10] = { 0 };
	memcpy(nums2 , nums1 , 20);
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("%d " , nums2[i]);
	}

	return 0;
}

在这里插入图片描述

函数的模拟实现:

#include <assert.h>

void* _memcpy(
	void * dest, 
	const void * src, 
	size_t count
) {
	assert(dest != NULL && src != NULL);

	void* temp = dest;

	while (count) {
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;

		count--;
	}

	return temp;
}

注:
1.memcpystrcpy 的区别是 memcpy 可以拷贝任意类型的数据,但是 strcpy只可以对字符串使用。
2.memcpy 不可以拷贝同一块内存空间的数据。


2.memmove

函数原型:

void *memmove( void *dest, const void *src, size_t count );
  • void *dest 目标数据首元素地址
  • const void *src 源数据(需要拷贝过去的数据)
  • size_t count 需要拷贝数据的字节大小
  • void *memmove 拷贝结束后,返回目标数据的起始地址

函数作用: 拷贝 count 个字节的数据从源数据起始地址到目标空间。与 memcpy不同的是,memmove可以拷贝同一块内存空间的数据。

函数的使用

#include <stdio.h>
#include <string.h>

int main() {

	int nums1[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
	memmove(nums1 + 2, nums1, 20); // 1 2 1 2 3 4 5 8 9 10
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("%d ", nums1[i]);
	}

	return 0;
}

在这里插入图片描述

函数的模拟实现:

#include <assert.h>

void* _memmove(
	void* dest,
	const void* src,
	size_t count
) {
	assert(dest != NULL && src != NULL);

	void* temp = dest;

	if (src < dest) {
		// 从后向前拷贝
		while (count) {
			*((char*)dest + count - 1) = *((char*)src + count - 1);

			count--;
		}
	}
	else {
		// 从前向后拷贝
		while (count) {
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;

			count--;
		}
	}

	return temp;
}

memmove 在实现的过程中,要分两种情况。

  1. src 小于 dest 时,我们需要从后向前拷贝数据,防止数据的覆盖。
  2. src 大于 dest 时,我们需要从前向后拷贝数据,防止数据的覆盖。

3.memcmp

函数原型:

int memcmp( const void *buf1, const void *buf2, size_t count );
  • const void *buf1 数据1首元素地址
  • const void *buf2 数据2首元素地址
  • size_t count 需比较数据的多少个字节
  • int memcmp 返回一个整型
    • > 0 说明第一个数据大于第二个数据
    • < 0 说明第一个数据小于第二个数据
    • = 0 说明两个数据相等

函数作用: 比较 count 个字节两个数据域中的数据是否相等。

函数的使用

#include <stdio.h>
#include <string.h>

int main() {
	int nums1[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
	int nums2[10] = { 1 , 2 , 3 , 4 , 5 };
	printf("%d" , memcmp(nums1 , nums2 , 20)); // 0

	return 0;
}

在这里插入图片描述


4.memset

函数原型:

void *memset( void *dest, int c, size_t count );
  • void *dest 被填充数据的首元素地址
  • int c 填充的数据
  • size_t count 填充的多少字节的数据
  • void *memset 返回填充后数据的首元素地址

函数作用: 内存空间填充数据。

函数的使用

#include <stdio.h>
#include <string.h>

int main() {
	int nums[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
	int * res = (int*)memset(nums , 0 , 20);
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("%d " , *(res + i));
	}

	return 0;
}

在这里插入图片描述
注: memset会把数据的每一个字节都填充成你要填充的那个元素。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值