前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C进阶:内存函数memcpy, memmove, memcmp

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

作者头像
aosei
发布2024-01-23 13:34:20
1450
发布2024-01-23 13:34:20
举报
文章被收录于专栏:csdn-nagiYcsdn-nagiY

一.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> 中;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.memcpy
    • 1.功能
      • 2.库函数定义
        • 3.实例
          • 4.模拟实现
          • 二.memmove
            • 1.功能
              • 2.库函数定义
                • 3.实例
                  • 4.模拟实现
                  • 三.memcmp
                    • 1.功能
                      • 2.库函数定义
                        • 3.实例
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档