我试图使用void指针实现memcpy函数。
我的buf1是“apple”而buf2是“banana”。 我期望输出“香蕉”和“香蕉”,但我得到了一个分段错误 * s1_charPtr ++ = * s2_charPtr ++;
我尝试调试它,但GDB没有给我一个有用的信息。
我想遵守这些规则:
我做错了什么?这是我的代码:
#include <iostream>
using namespace std;
void* memcpy(void* s1, const void* s2, unsigned n){
char* s1_charPtr = static_cast<char*>(s1);
const char* s2_charPtr = static_cast<const char*>(s2);
int i = 0;
while(i < n){
*s1_charPtr++ = *s2_charPtr++;
i++;
}
}
int main(){
char* buf1 = new char[10];
const char* buf2 = new char[10];
buf1 = "apple";
buf2 = "banana";
memcpy(buf1, buf2, 5);
cout << buf1 << "\n" << buf2 << endl;
delete[] buf1;
delete[] buf2;
}
答案 0 :(得分:8)
问题在于这些任务:
buf1 = "apple";
buf2 = "banana";
在此之后,buf1
和buf2
不再指向您之前使用new
分配的缓冲区,它们指向这些文字字符串。文字字符串是常量,因此当您尝试修改"apple"
时,您会遇到错误。
你应该这样做:
strcpy(buf1, "apple");
strcpy(buf2, "banana");
这就是你应该注意编译器警告的原因:
testmemcpy.cpp:18: warning: deprecated conversion from string constant to 'char*'
答案 1 :(得分:2)
您似乎相信buf1 = "apple";
将字符串文字复制到您之前分配的缓冲区中。不是这种情况。而是使buf1
指向内存中字符串文字的位置,并且之前分配的缓冲区只是泄漏。
然后尝试写入字符串文字所在的内存。这表现出不确定的行为。实际上,许多编译器(包括GCC)将字符串文字放入标记为只读的内存段 - 因此会出现分段错误。
答案 2 :(得分:0)
您的代码:
char* buf1 = new char[10];
const char* buf2 = new char[10];
buf1 = "apple";
buf2 = "banana";
buf1和buf2:它们是指针,而不是字符串.'buf1 =“apple”'这样的行为将指针重定向到const字符串“apple”的头部。
最后你删除了这些没有指向你刚分配的内存位置的指针,显然这会导致内存泄漏。
请使用'strcpy'。