自定义memcpy与void指针

Pet*_*ang -2 c++ pointers

我试图使用void指针实现memcpy函数.

我的buf1是"苹果",buf2是"香蕉".我期望输出"香蕉"和"香蕉"但是我在*s1_charPtr ++ =*s2_charPtr ++时遇到了分段错误;

我试图调试它,但GDB没有给我一个有用的信息.

我想保留这些规则:

  1. 我想保留函数的类型及其参数.
  2. 使用指针取消引用已转换的参数.

我做错了什么?这是我的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*mar 8

问题是这些任务:

buf1 = "apple";
buf2 = "banana";
Run Code Online (Sandbox Code Playgroud)

在此之后,buf1并且buf2不再指向您之前分配的缓冲区new,它们指向这些文字字符串.文字字符串是常量,因此当您尝试修改"apple"时会出现错误.

你应该做:

strcpy(buf1, "apple");
strcpy(buf2, "banana");
Run Code Online (Sandbox Code Playgroud)

这就是你应该注意编译器警告的原因:

testmemcpy.cpp:18: warning: deprecated conversion from string constant to 'char*'
Run Code Online (Sandbox Code Playgroud)