C语言::memmove函数功能、原型、用法及实例 - 高小调博客

C语言::memmove函数功能、原型、用法及实例

功能

memmove函数的功能是由src所指内存区域复制count个字节到dest所指内存区域.

当目标区域和源区域发生重叠时,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后src内容会被更改.

如果目标区域与源区域没有重叠,memmove函数功能则和memcpy函数功能相同.

(原理:在进行拷贝之前,对src与dest的位置进行判断.)

(如果dest<src时,从后往前拷贝;否则,从前往后拷贝.)

(更多信息,详见:模拟实现memmove函数)

原型

void *memmove(void* dest,const void* src,size_t count);

(定义于<string.h>)

参数

dest:目标区域.

src:源区域.

count:复制字节数

返回值

memmove函数最终返回dest的值

函数实现

//Windows下memmove函数的实现核心代码(去掉条件编译部分)
void * __cdecl memmove (void * dst,const void * src,size_t count){
	void * ret = dst;
	if (dst <= src || (char *)dst >= ((char *)src + count)) {
		//没有发生内存重叠,从低地址向高地址拷贝
		while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst + 1;
			src = (char *)src + 1;
		}
	}else{
		////内存重叠,从高地址向低地址拷贝
		dst = (char *)dst + count - 1;
		src = (char *)src + count - 1;
		while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst - 1;
			src = (char *)src - 1;
		}
	}
	return(ret);
}

用法及实例

/*
*本代码版权归高小调博客所有 
*作者:高小调
*日期:2016-8-14
*代码功能:简单的示范一下memmove函数的用法
*集成开发环境:Microsoft Visual Studio 2010 
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
//模拟实现memcpy函数
void *my_memcpy(void *dest,const void *src,size_t n){
    char *pdest = (char *)dest;
    char *psrc = (char *)src;
    void *ret = dest;
    //断言
    assert(dest!=NULL);
    assert(src!=NULL);
    while(n--){
        *pdest++ = *psrc++;
    }
    return ret;
}
int main(){
	char str1[20]="0123456789";
	char str2[20]="0123456789";
	//dest位于src+count中间,发生内存重叠现象
	memmove(str1+5,str1+3,4*sizeof(char));
	//memmove函数可以处理内存重叠的情况
	//而memcpy函数根据平台不同不一定会处理内存重叠现象
	//因此,我们用模拟实现的memcpy函数与memmove函数做对比
	my_memcpy(str2+5,str2+3,4*sizeof(char));
	printf("str1:%s(内存重叠处理后)\n",str1);
	printf("str2:%s(内存重叠未处理)\n",str2);
	system("pause");
	return 0;
}

输出

memmove函数实例程序

小调祝你一切安好.

本文由高小调博客原创!

原文地址:http://gaoxiaodiao.com/p/28.html

如欲转载,请注明出处!

PS:吃饭,吃饭,吃饭,再不去学校食堂就要关门了!

非常草率地做个结尾...

(未完待续...)

上一篇:
下一篇: