内存覆盖

//memmove()函数解决内存覆盖问题
#include<iostream> #include<assert.h> using namespace std; void *memmove(void *dest, const void *source, size_t count) { assert((NULL != dest) && (NULL != source)); char *tmp_source, *tmp_dest; tmp_source = (char *)source; tmp_dest = (char *)dest; if((tmp_dest + count<tmp_source) || (tmp_source + count) <tmp_dest) {// 如果没有重叠区域 while(count--) *tmp_dest++ = *tmp_source++; } else { //如果有重叠(反向拷贝) tmp_source += count - 1; tmp_dest += count - 1; while(count--) *--tmp_dest = *--tmp_source; } return dest; }
 
//memcpy()函数对内存覆盖的解决方案
#include<iostream> #include<assert.h> using namespace std; void * memcpy(void * dest, void * source,size_t count) { if(dest==NULL||source==NULL) { return NULL; } else { char * tmp_source,* tmp_dest; tmp_source=(char *)source; tmp_dest=(char *)dest;//如果指针是字符串,我们必须考虑字符串的长度 if(tmp_dest + count >= tmp_source || tmp_source + count >= tmp_dest) { if(tmp_dest + count >= tmp_source)//dest在source前面并且出现内存重叠,从前向后拷贝 { while(count--) { *tmp_dest++=*tmp_source++; } } else//dest在source后面并出现内存重叠,从后往前拷贝 { tmp_dest+=count-1; tmp_source+=count-1; while(count--) { *tmp_dest--=*tmp_source--; } } } else//无内存重叠现象 { while(count--) { *tmp_dest++=*tmp_source++;// *tmp_dest--=*tmp_source也可以 } } } return dest; }


`memcpy`函数是C/C++中用于内存拷贝的标准库函数。它可以在内存之间复制指定数量的字节。为了避免内存覆盖错误,我们应该遵循以下几个原则: 1. 确保目标内存有足够的空间来接收源内存的内容。这通常意味着目标缓冲区的大小不能小于源内存的大小,否则可能会导致目标缓冲区之外的内存覆盖,从而引起未定义行为。 2. 使用`memcpy`时,最好指定一个确切的字节数,而不是依赖于`sizeof`运算符,除非你非常确定数据结构的大小。例如,如果你想要复制一个结构体,你应当使用`sizeof(struct_type)`来获取结构体的实际大小。 3. 避免使用`memcpy`来拷贝包含指针的数据,因为这样做拷贝的只是指针本身的值,而不是指针指向的数据。如果需要复制指针指向的数据,应该逐个元素或者使用其他安全的复制函数(比如`strcpy`对于字符串)。 4. 使用`memcpy`时,确保源内存和目标内存不重叠,否则结果是未定义的。如果内存区域可能重叠,可以考虑使用`memmove`,因为它能正确处理重叠内存区域的复制。 下面是一个使用`memcpy`的示例代码: ```c #include <stdio.h> #include <string.h> int main() { // 假设有一个结构体类型 struct Data { int a; char b; }; struct Data source = {10, 'A'}; struct Data dest; // 确保dest有足够的空间 // 记得使用结构体的实际大小,而不是使用sizeof(struct Data),以避免潜在的填充字节问题 memcpy(&dest, &source, sizeof(struct Data)); printf("dest.a = %d, dest.b = %c\n", dest.a, dest.b); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值