memcpy在什么情况下会失败

如题所述

1、memcpy在使用时注意不可用字符串,如果是字符串会导致段错误,可以使用asprintf函数复制字符串,从而导致memcpy的段错误。

2、即memcpy不能拷贝目的地址(dest)和源地址(src)内存空间有重合的部分,更为确切的说应该是当目的地址大于源地址的时候,不能够有重合部分,否则源地址重合部分数据会发生错误。

3、当copy越界时,可能会出现程序异常。

扩展资料:

如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针。

参考资料来源:

百度百科-memcpy

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-15
memcpy进行内存拷贝时有可能发生内存读写错误,比如length大于要拷贝的空间或大于目的空间,可能发生:
int *p = new[10];
memcpy(dst, p, 20);//20超过10了,由于p是堆内分配的,所以超过的部分不属于进程空间,发生内存读写错误。
而int p[10];memcpy(dst, p, 20);不发生错误,因为定义的变量在栈里,p超过10位仍属于进程空间。本回答被网友采纳
第2个回答  推荐于2017-09-21
1. 失败情况:copy的区域重叠。
例如如下例子
memcpy(a, b, 10);
如果指针b在a之前且距离小于10,则实际copy结果没有达到预计目标,
这个和memcpy的实现有关。这种情况需要使用memmove。

2. 异常情况
当copy越界时,可能会出现程序异常。
如果是在栈上,那可能更麻烦,因为它出现异常的位置往往不是真的有问题的位置。本回答被提问者采纳
第3个回答  2012-10-15
memcpy(dst,src,size);
1、当dst或src==NULL或野指针时会失败
2、当size==0时,会失败
相似回答