我正在学习C
和C++
,我试图在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
}
答案 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有许多修饰符函数:insert,replace等...
如果您想了解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机器指令(SSE4,AVX等等来复制更快的内存块... )。但要做到这一点,它必须处理额外的机器限制(例如数据对齐),而细节则是邪恶。
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的书并练习它。我们不能在这里提供这么长的答案。 未定义行为的概念很重要:即使您的代码没有使您的机器崩溃,也可能非常错误