memcpy()和 memmove()

2024-04-04 17:48
文章标签 memcpy memmove

本文主要是介绍memcpy()和 memmove(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

memcpy()和memmove()都是从一块内存拷贝内容去另外一块内存。区别在于memcpy()不考虑内存重叠,容易出错,memmove()考虑内存重叠,保证安全。

memcpy()

void* memcpy(void *dest, void *src, size_t size)
{

 if(dest == nullptr || src == nullptr||size<=0)return nullptr;char *p=(char *) dest;char *q=(char *) src;
while(size--)
{*p++=*q++;
}
return dest;

}

memmove()

void *memcpy(void *dest, void *src, size_t size)
{
if(dest == nullptr || src == nullptr)
return nullptr;
char *p=(char *) dest;
char *q=(char *) src;

if(dest < src || (char*)src+size < (char*)dest)//没有内存重叠
{while(size--){*p++=*q++;}
}
else//有内存重叠
{p = p+size-1;q = q+size-1;while(size--){*p--=*q--;}
}
return dest;

}

这篇关于memcpy()和 memmove()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/876444

相关文章

memcpy 和 memmove区别

‌memcpy和memmove的主要区别在于它们处理内存区域重叠的能力不同。‌ ‌处理内存区域重叠的能力‌: ‌memcpy‌不支持内存区域的复制如果源和目标内存区域重叠,memcpy的行为是未定义的。这意味着,如果尝试使用memcpy复制重叠的内存区域,可能会导致数据损坏或不可预测的行为。‌memmove‌则支持内存区域的复制,即使源和目标内存区域重叠。当发生重叠时,memmove会正确地处

警惕memcpy()函数越界

在维护一个工程师的代码时,发现memcpy()导致越界

2.C语言实现函数void *memmove(void *dest, const void *src, size_t n)。memmove 函数的功能是拷贝src所指的内存内容前n个字节到dest所指

//用C语言实现函数void * memmove(void *dest, const void *src, size_t n)。memmove//函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。//分析:由于可以把任何类型的指针赋给void类型的指针,这个函数主要是实现各种数据类型的拷贝。//要考虑正向拷贝和反向拷贝问题#include<stdio.h>#include<

函数(void*)memcpy(voidnbsp;*dest,con…

函数原型  void *memcpy(void *dest, const void *src, int n); 功能   从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中 所需头文件   #include <string.h> 返回值   函数返回一个指向dest的 指针。 说明   1.source和destin所指内存区域不能重叠,函数返回指向dest

c memcpy 与 strcpy 区别

memcpy与strncpy区别     strncpy是把Num个字符从src复制到dest,但是如果遇到src字符结尾,那么复制提前结束,后面没有复制完的字符,不予以处理,当然dest,src地址不能重叠,     memcpy也是把Num个字符从src复制到dest,但是它是内存复制,不管是不是NULL,照样通吃

不同内存对齐方式 memcpy之后数据错误

一.背景: 1.使用#pragma定义结构体:RECV_CMD_DATA_t和RECV_CMD_PACK_t,按照1字节进行内存对齐 #pragma pack(1)typedef struct recv_cmd_data{int iType;long long llInt;int iLen;char

memcpy函数,自动获取LCD硬件参数

示例:将开发板颜色变为红色 #include<stdio.h>#include<unistd.h>#include<sys/mman.h>#include<string.h>#include<fcntl.h>#include<linux/fb.h>int main(){// 以读写权限打开液晶屏文件int lcd = open("/dev/fb0", O_RDWR);// 给LCD设

memset、memcpy等mem家族函数

整理一下mem家族函数。 文章目录 memsetmemcpy memset 这是我最喜欢的函数。初始化为非零的数,或者中途使用的时候直接全部重置。 memcpy 我也喜欢这个函数,整段复制,终于不用for循环挨个复制了。 char *s = "GoldenGlobalView";char d[20];memcpy(d, s + 3, 4); //从第13个字符(V)开始复

【c++】10. memset()、【strcpy_s()、memcpy_s()】、【strcpy(),memcpy()】

选择使用【strcpy_s、memcpy_s】还是选择【strcpy,memcpy】? memset()的用法 memcpy_s,strcpy_s函数明确的指定了目标内存的大小,能够清晰的暴露出内存溢出的问题,而普通的memcpy、strcpy则不会。 为了保证内存拷贝有足够的空间,防止笔误,【尽量使用memcpy_s代替memcpy】。 (1)memcpy_s()的用法: errno_t

C++复制内存(memcpy)/设置内存(memset)

一:memcpy函数,复制内存 注意是memcpy,不是memccpy int a[5]{11,22,33};int* b = new int[5];// 从内存a处开始,复制20个字节,到指针b处memcpy(b,a,20);for (int i = 0; i < sizeof(a)/4;i++) {std::cout << b[i] << std::endl;} 二:memse