为什么memcpy不复制我提供给它的数据? 我在C++中做了一个内存管理器/分配器。函数“memcpy”似乎没有按预期工作。以下是违规代码: template <class Type> Data<Type> MemoryManager::alloc(Type* data) { ... printf("Allocating data of size %i at local address %i, absolute address %i\n", allocSize, allocAddress, allocStart + allocAddress); ... std::cout << *data << std::endl; memcpy(data, (Type*)(allocStart + allocAddress), allocSize); std::cout << *(Type*)(allocStart + allocAddress) << std::endl; ... }

为什么memcpy不复制我提供给它的数据? 我在C++中做了一个内存管理器/分配器。函数“memcpy”似乎没有按预期工作。以下是违规代码: template <class Type> Data<Type> MemoryManager::alloc(Type* data) { ... printf("Allocating data of size %i at local address %i, absolute address %i\n", allocSize, allocAddress, allocStart + allocAddress); ... std::cout << *data << std::endl; memcpy(data, (Type*)(allocStart + allocAddress), allocSize); std::cout << *(Type*)(allocStart + allocAddress) << std::endl; ... },c++,memory,memcpy,C++,Memory,Memcpy,如您所见,数据(它是指向类型的指针)在我尝试取消引用时指向正确的值20。但是,在使用memcpy复制到新地址(也是指向类型的指针)后,该值变为-84215041。有趣的是它总是这个数字,不管我用什么测试,不管实际地址是什么。此外,这个数字不是我的系统中整数的最小值-正如您所看到的,整数的大小是4字节。那么这个数字是多少?为什么memcpy总是把它复制到我的地址,而不是我给它的数据 编辑:我的论点顺序不对。问题解决了。但是我的第二个问题仍然存在,那个数字是什么,为什么不管我的来源是什么,它总是被复

如您所见,
数据
(它是指向
类型
的指针)在我尝试取消引用时指向正确的值20。但是,在使用memcpy复制到新地址(也是指向
类型的指针)后,该值变为-84215041。有趣的是它总是这个数字,不管我用什么测试,不管实际地址是什么。此外,这个数字不是我的系统中整数的最小值-正如您所看到的,整数的大小是4字节。那么这个数字是多少?为什么memcpy总是把它复制到我的地址,而不是我给它的数据


编辑:我的论点顺序不对。问题解决了。但是我的第二个问题仍然存在,那个数字是什么,为什么不管我的来源是什么,它总是被复制进来?

第一个参数应该是Destination,第二个参数应该是source 像这样:

void * memcpy ( void * destination, const void * source, size_t num );
一个简单的例子:

char myname[] = "Pierre de Fermat";
/* using memcpy to copy string: */
memcpy ( person.name, myname, sizeof(myname) );

memcpy
的第一个参数是destination,而不是source。具有复制语义(复制构造、复制赋值)的任何类型的对象都不能通过像
std::memcpy
这样的字节机制进行复制。关于
memcpy()
:您知道第一个参数是destination,第二个是source吗?从您的代码片段中,我相信您试图使用它们进行交换。此外,如果你觉得有必要做一个C风格的演员,你应该把这当作你做错了什么的标志。总是使用C++的转换,例如代码> RealTytCase。你看到的十进制值是十六进制CDCDCDCD。一些平台使用它来标记未初始化的内存可以在编译时使用
sizeof(myname)
而不是在运行时使用
strlen(myname)+1
。是的,你是对的,sizeof()将是O(1)
char myname[] = "Pierre de Fermat";
/* using memcpy to copy string: */
memcpy ( person.name, myname, sizeof(myname) );