C语言的内存库函数介绍

目录

一、内存拷贝库函数memcpy

1、memcpy介绍

2、c语言的模拟实现memcpy

二、内存拷贝库函数memmove

1、memmove介绍

2、c语言的模拟实现memcpy

三、内存比较函数memcmp

1、memcmp介绍

四、内存设置函数memset

1、memset介绍


一、内存拷贝库函数memcpy

1、memcpy介绍

memcpy介绍
函数名称memcpy
函数头文件<string.h>
函数格式void * memcpy ( void * dest, const void * src, size_t num );
函数功能memcpy从src的位置开始向后复制num个字节的数据到dest的内存位置, 这个函数在遇到 '\0' 的时候并不会停下(), 如果destsrc有任何的重叠,复制的结果都是未定义的。
返回类型返回dest的起始位置

2、c语言的模拟实现memcpy

void* gg_memmove(void* arr2, void* arr1, int num) {   //因为不知道要接受怎么的类型所以使用
                                                      //所以使用void*就可以接受任何类型
	void* red = arr2;                                 //记录目的地的起始位置用以返回
	assert(arr2);
	assert(arr1);
	while (num--) {
			*((char*)arr2)++ = *((char*)arr1)++;    //一个一个字节的交换
	}
	return red;
}
int main() {
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int arr2[20] = {0};
	int* red = (int*)gg_memmove(arr+2, arr, 16);
	for (int i = 0; i < 4; i++) {
		printf("%d ", red[i]);
	}
}

 编译结构为什么会是:1 2 1 2呢?

我们预期是要将arr的0到3的下标元素{1,2,3,4};

拷贝到arr的2到4的下标元素中,打印出来的结果和我们预期的出现了一点差错

这是因为如果目的地源空间有任何的重叠,复制的结果都是未定义的。

但是在vs的memcpy库函数,即使有重叠也会将源空间里的数据完全不变的拷贝到目的地空间(但这其实是memmove要实现的功能)。

二、内存拷贝库函数memmove

1、memmove介绍

memmove介绍
函数名称memmove
函数头文件<string.h>
函数格式void* memmove(void* destination, const void* source, size_t num);
函数功能memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置, 这个函数在遇到 '\0' 的时候并不会停下(),将数字字节的值从指向的位置复制到目标所指向的内存块。复制就像使用了中间缓冲区一样进行,从而允许目标和重叠。
返回类型返回destination的起始位置

2、c语言的模拟实现memcpy

void* gg_memmove(void* arr2, void* arr1, int num) {
	void* red = arr2;
	assert(arr2);
	assert(arr1);
	while(num--){                                            
		if (arr2 > arr1) {      //判断目的地起始位置在原空起始位置的大小(判断位置)确定交换方式
			*(((char*)arr2) + num) = *(((char*)arr1) + num);   //从后往前交换 
		}
		else {
			*((char*)arr2)++= *((char*)arr1)++;                //从前往后交换 
		}
	}
	return red;
}
int main(){
	int arr[] = {1,2,3,4,5,6,7,8,9};
	int arr2[20]={0};
	int*red=(int*)gg_memmove(arr+2,arr,16);
	for (int i = 0; i <4; i++) {
		printf("%d ", red[i]);
	}
}

三、内存比较函数memcmp

1、memcmp介绍

memcmp介绍
函数名称memcmp
函数头文件<string.h>
函数格式int memcmp ( const void * ptr1, const void * ptr2, size_t num );
函数功能

将 ptr1 所指向的起始空间的第num个字节和与 ptr2 所指向的起始空间的第num个字节进行比较,如果它们全部匹配,则返回零,如果它们不匹配,则表示哪个值更大。

返回类型

<0    在两个内存块中不匹配的第一个字节在 ptr1 中的值低于在 ptr2 中的值(如果计算为无符号字符值)

0    内容相等

>0    在两个内存块中都不匹配的第一个字节在 ptr1 中的值大于在 ptr2 中的值(如果计算为无符号字符值)

四、内存设置函数memset

1、memset介绍

memset介绍
函数名称memset
函数头文件<string.h>
函数格式void * memset ( void * ptr, int value, size_t num );
函数功能将 ptr 所指向的内存块的前 num 个字节设置value为值
返回类型返回 ptr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值