memcpy、strcpy 和memmove

strcpy和memcpy都是标准c库函数,它们的特点:

strcpy提供了字符串的复制,strcpy只用于字符串的复制,不仅复制字符串内容外,还会复制字符串的结束符。

strcpy的函数原型是: char* strcpy(char* dest, const char* src);

char *strcpy(char *dest,const char *src){
	if((src==NULL)||(dest==NULL)) return NULL;
	char *strdest = dest;//保存目标字符串的首地址
	while((*dest++=*src++)!='\0');
	return strdest;
}


memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字符到目标dest所指的

内存地址的起始位置。

memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广。

函数原型是:void *memcpy(void *dest,const char* src, size_t count);

void *memcpy(void *memTo,const void *memFrom,size_t size){
	if((memTo==NULL)||(memFrom==NULL)) return NULL;
	char *tempFrom = (char *)memFrom;//保存memFrom的首地址
	char *tempTo = (char *)memTo;//保存memTo的首地址
	while(size-->0){
		*tempTo++=*tempFrom++;
	}
	return memTo;
}

strcpy和memcpy主要有以下三点区别:

1.复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串,整型,结构体,类等。

2.复制的方法不同。strcpy不需要指定长度,它遇到被复制字符串的结束符'\0'才结束,所以容易溢出。

memcpy则是根据第三个参数决定复制的长度。

3.用途不同,通常在复制字符串时使用strcpy,而复制其他类型的数据是memcpy。


memcpy和memmove都是C语言中的库函数,在库函数string.h中,其原型很相似,它们都是从src所指向的

内存中复制cnt个字符到dest所指向的内存中,并返回dest的值。

当源内存区域和目标内存区域无交叉重叠时,两者的结果是一样的,但是如果有交叉呢?

memcpy是从src的起始部分开始复制,所以虽然第一种情况下没有问题,但是如果遇到第二种情况,

则会发生错误,交叉部分的src内容就会被覆盖掉了。

而memmove则由于采用不同的复制机制,所以可以正确处理第二种情况。

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。

void *memmove(void *dst,const void *src,int n){
	char *dp = (char *)dst;
	char *sp = (char *)src;
    assert((src!=0)&&(dst!=0)&&(n>0));
	if(sp>dp||(sp+n)<dp)//非重叠
	{
		while(n--)
			*(dp++)=*(sp++);
		*dp='\0';
	}
	else if(sp<dp){//重叠 此时条件 sp<dp<(sp+n) 如果sp==dp则快速的返回
		//反向拷贝
		sp+=n;
		dp+=n;
		*dp='\0';
		while(n--)
			*(--dp)=*(--sp);
	}
	return dst;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用: 结果发现:memcpy在拷贝数据时与strcpy和strncpy不同的是memcpy遇到 '\0' 是不会停止拷贝到。 引用: 知识点4:memcpy()函数的模拟:void* my_memcpy(void* dst, const void* src, size_t count) { ... } 引用: 代码演示:memcpy(arr2, arr1, 6); memset和memcpy是C语言中的两个函数。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' 就停止拷贝,而是会一直拷贝下去直到拷贝完指定的字节数。这是memcpystrcpy和strncpy的一个区别。 在引用中给出了一个自定义的my_memcpy函数的示例代码,该函数模拟了memcpy函数的功能。 在引用中给出了一个使用memcpy函数的示例代码,该代码将字符串"abc\0def"的前6个字节拷贝到另一个字符数组中。 综上所述,memset和memcpy是C语言中用于操作内存的两个函数,分别用于设置内存区域的值和拷贝内存区域的数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [内存函数:memcpymemmove、memcmp、memset(超详细讲解,小白一看就懂!!!!)](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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值