C进阶:内存函数memcpy, memmove, memcmp

C/C++
155
0
0
2024-04-30

一.memcpy

1.功能

拷贝内存块,将字节的值从指向的位置直接复制到目标指向的内存块。

2.库函数定义

3.实例

代码语言:javascript

复制

/* memcpy example */
#include <stdio.h>
#include <string.h>

struct {
  char name[40];
  int age;
} person, person_copy;

int main ()
{
  char myname[] = "Pierre de Fermat";

  /* using memcpy to copy string: */
  memcpy ( person.name, myname, strlen(myname)+1 );
  person.age = 46;

  /* using memcpy to copy structure: */
  memcpy ( &person_copy, &person, sizeof(person) );

  printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );

  return 0;
}
4.模拟实现
我们仿照库函数的定义来设计参数和返回值;因为参数的类型是 void * ,所以不能直接解引用,和 qsort 函数那里一样,我们采用强制类型转换成 char * ,然后解引用;

qsort函数:http://t.csdn.cn/iLwjY

具体代码:

代码语言:javascript

复制

void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;
	while (num--)
	{
		//*((char*)dest)++ = *((char*)src)++;   //这种写法并不是所有编译器都行的
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}
C 语言定义中, memcpy ,只需要拷贝不重叠的部分,但在 vs 编译器中,memcpy 也能拷贝重叠的部分,功能和 memmove 类似了;

二.memmove

1.功能

移动内存块,将字节的值从指向的位置复制到目标指向的内存块。

2.库函数定义

3.实例

代码语言:javascript

复制

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

int main ()
{
  char str[] = "memmove can be very useful......";
  memmove (str+20,str+15,11);
  puts (str);
  return 0;
}
4.模拟实现

请看下图:

具体代码:

代码语言:javascript

复制

void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;
	if (dest > src)
	{
		//从后往前
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	else if (dest < src)
	{
		//从前往后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	return ret;
}

三.memcmp

1.功能

比较两个内存块;

2.库函数定义

3.实例

代码语言:javascript

复制

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

int main ()
{
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";

  int n;

  n=memcmp ( buffer1, buffer2, sizeof(buffer1) );

  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);

  return 0;
}

运行结果:

以上的内存函数都定义在头文件 <string.h> 中;