构建一个等同于memcpy的函数

时间:2015-03-14 06:53:09

标签: c

我正在学习CC++,我试图在C或C ++中找到相当于:memcpy((char *) (m + 1), &e, sizeof(int)),即我正在尝试构建自己的memcpy函数。我尝试使用以下指针移动:

std::string s = std::to_string(5);
void *ptr=m;
char *charPtr=(char*)ptr;
++charPtr = const_cast<char*>(s.c_str());             

但是我发现这不等同于C memcpy((char *) (m + 1), &e, sizeof(int))。有人可以建议我哪里出错了。我的完整代码段如下:

enum MT {A,B,C};

typedef struct M{
    enum MT mT;
}M;


int main(){
    M *m = (M*) malloc(5 * sizeof(char));
    int e=5;

    //finding an equivalent of memcpy((char *) (m + 1), &e, sizeof(int)); START
    std::string s = std::to_string(5);
    void *ptr=m;
    char *charPtr=(char*)ptr;
    ++charPtr = const_cast<char*>(s.c_str());             
    //finding an equivalent of memcpy((char *) (m + 1), &e, sizeof(int)); END
}

2 个答案:

答案 0 :(得分:3)

替代方法是std::copy(),尽管memcpy()继续在C语言中工作的同类情况下工作(也就是说,当知道结构可以是逐字节复制而不会破坏事物。)

答案 1 :(得分:2)

请注意,C和C ++是不同的语言(但C ++设计为与C的子集友好)。你不能学习C和C ++,你可以学习C和学习C ++。同样,你不能学习“法语和德语”(没有这样的语言),但你可以学习法语和学习德语。

详细了解C ++,特别是标准containers&amp; std::string - s&amp; <algorithm>;您可能应该考虑使用std::vector<M>std::array<M>(而不是malloc - ed指针m ...)

memcpy很少有用(但很有用)。

请注意std::string - s有许多修饰符函数:insertreplace等...


如果您想了解memcpy的实施方式,请查看memcpy implementation s。然而,在实践中,使用一些内置的编译器(例如性能原因)是非常重要的,例如, __builtin_memcpy中的GCC。但这是一个实现细节(但非常重要)。

理论上,memcpy可以在C中天真地实现,例如

void my_memcpy(void*dst, const void*src, size_t siz)
{
   char*pdst = dst;
   const char*psrc = src;
   for (size_t ix=0; ix<siz; ix++) 
      pdst[ix] = psrc[ix];
}

还有其他流行的变种,如

   while (siz-->0) *(pdst++) = *(psrc++);

但实际上,计算机可以使用整个words甚至使用vector机器指令(SSE4AVX等等来复制更快的内存块... )。但要做到这一点,它必须处理额外的机器限制(例如数据对齐),而细节则是邪恶。


顺便说一下,你的代码非常错误。您假设sizeof(M)是1.它可能不是。然后你的m指针可能没有足够的空间。

我建议(假设你在Linux上使用最近的GCC编译器)至少编译所有警告和调试信息g++ -std=c++11 -Wall -Wextra -g并使用gdb调试器逐步进入你的代码。

BTW,在我的Linux / Debian / Sid / x86-64上GCC 4.9,以下程序

#include <iostream>

enum MT{A,B,C};

typedef struct M{
    enum MT mT;
}M;

int main() {
  std::cout << "sizeof(M)=" << sizeof(M) << std::endl;
  return 0;
}     

正在显示

sizeof(M)=4

所以您的代码完全没有意义(undefined behavior因为buffer overflow)。我甚至不明白你想要它做什么!

PS。我不确定你会在这里得到有用的答案。您对C ++的误解是如此之大,以至于您需要花费数天或数周来阅读有关C ++的整本书(甚至更多)。如果你想学习C,你还需要几周的时间来阅读一本关于C的书并练习它。我们不能在这里提供这么长的答案。 未定义行为的概念很重要:即使您的代码没有使您的机器崩溃,也可能非常错误