自定义memcpy与void指针

时间:2013-12-25 01:27:00

标签: c++ pointers

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

我的buf1是“apple”而buf2是“banana”。 我期望输出“香蕉”和“香蕉”,但我得到了一个分段错误     * s1_charPtr ++ = * s2_charPtr ++;

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

我想遵守这些规则:

  1. 我想保留函数的类型及其参数。
  2. 使用指针取消引用已转换的参数。
  3. 我做错了什么?这是我的代码:

    #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;
    }
    

3 个答案:

答案 0 :(得分:8)

问题在于这些任务:

buf1 = "apple";
buf2 = "banana";

在此之后,buf1buf2不再指向您之前使用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'。