C++ C中的数组/指针:在不知道底层类型的情况下复制

C++ C中的数组/指针:在不知道底层类型的情况下复制,c++,arrays,pointers,C++,Arrays,Pointers,假设我有一个unsigned char指针(uchar*从现在开始)指向T类型数组的开头,它不同于uchar。知道此数组的大小并且它是连续的(使用malloc创建),是否可以在不知道类型T的情况下将其复制到另一个数组?我如何访问它的每个字节 谢谢您可以使用简单的memcpy或memmove创建所有内容的浅拷贝,但您最好确保数组元素不是包含任何指针的类对象。或者更准确地说,确保它们是。您可以使用简单的memcpy或memmove创建所有内容的浅拷贝,但最好确保数组元素不是包含任何指针的类对象。或者

假设我有一个
unsigned char
指针(
uchar*
从现在开始)指向
T
类型数组的开头,它不同于
uchar
。知道此数组的大小并且它是连续的(使用
malloc
创建),是否可以在不知道类型
T
的情况下将其复制到另一个数组?我如何访问它的每个字节


谢谢

您可以使用简单的
memcpy
memmove
创建所有内容的浅拷贝,但您最好确保数组元素不是包含任何指针的类对象。或者更准确地说,确保它们是。

您可以使用简单的
memcpy
memmove
创建所有内容的浅拷贝,但最好确保数组元素不是包含任何指针的类对象。或者更准确地说,请确保它们是正确的。

您可以执行以下操作:

T foo; // your given arbitrary object
T bar; // target

unsigned char * p = reinterpret_cast<unsigned char *>(&foo);  // type-punned
unsigned char * q = reinterpret_cast<unsigned char *>(&bar);  // ditto

memcpy(q, p, sizeof(T)); // copy byte-wise
T foo;//给定的任意对象
T巴;//目标
unsigned char*p=reinterpret_cast(&foo);//类型双关语
unsigned char*q=reinterpret_cast(&bar);//同上
memcpy(q,p,sizeof(T));//按字节复制
如果
T
具有非平凡的属性(自定义构造函数、堆变量指针等),这可能会导致很多问题,但您肯定可以通过这些指针访问原始数据。(例如,如果您想查看
double
或类似的二进制表示形式,那么通常这样做可能会很有趣,但在生产代码中,这应该很少出现。)

如果原始对象是
T foo[N]
,请使用大小
sizeof(T)*N


编辑:您的意思是希望此功能适用于任意类型还是未知类型?如果您不知道
t
的大小(例如,如果只给您指针),那么您当然不能这样做,因为您不知道占用了多少内存。内存中没有可在运行时检查的“字段分隔符”或类似内容。

您可以执行以下操作:

T foo; // your given arbitrary object
T bar; // target

unsigned char * p = reinterpret_cast<unsigned char *>(&foo);  // type-punned
unsigned char * q = reinterpret_cast<unsigned char *>(&bar);  // ditto

memcpy(q, p, sizeof(T)); // copy byte-wise
T foo;//给定的任意对象
T巴;//目标
unsigned char*p=reinterpret_cast(&foo);//类型双关语
unsigned char*q=reinterpret_cast(&bar);//同上
memcpy(q,p,sizeof(T));//按字节复制
如果
T
具有非平凡的属性(自定义构造函数、堆变量指针等),这可能会导致很多问题,但您肯定可以通过这些指针访问原始数据。(例如,如果您想查看
double
或类似的二进制表示形式,那么通常这样做可能会很有趣,但在生产代码中,这应该很少出现。)

如果原始对象是
T foo[N]
,请使用大小
sizeof(T)*N



编辑:您的意思是希望此功能适用于任意类型还是未知类型?如果您不知道
t
的大小(例如,如果只给您指针),那么您当然不能这样做,因为您不知道占用了多少内存。内存中没有可在运行时检查的“字段分隔符”或类似的内容。

如果不知道数组大小,则完全错误,不能使用memcpy或memmove。@VGE:OP表示数组大小已知。@VGE:“知道此数组的大小并且它是连续的”--逐字摘自OP.@VGE,但是Renan没有提到数组大小是已知的吗?它们可以是pod,仍然包含指向自身或数组中其他对象的指针。在这种情况下,使用memcpy将失败。如果不知道数组大小,则完全错误,不能使用memcpy或memmove。@VGE:OP表示数组大小已知。@VGE:“知道此数组的大小并且它是连续的”--逐字摘自OP.@VGE,但是Renan没有提到数组大小是已知的吗?它们可以是pod,仍然包含指向自身或数组中其他对象的指针。在这种情况下,使用memcpy将中断。您知道数组的大小(以字节为单位)还是以元素数为单位?为什么您不知道类型
t
?听起来像是混合C和C++,这是个好主意。由于解释的时间太长,我不能使用模板类。然后,我的解决方案是将我需要的数据存储在这个“通用”指针中。但正因为如此,我不知道真正的类型。为什么仅仅将你的
uchar*
转换为
t*
是不够的?如果您知道数组的大小和
T
(如您所说)的大小,而不知道数组中的元素数,那么您是安全的,为什么问题的标题中有“C”,但标记为“C++”?您知道数组的大小(字节或元素数)吗?为什么您不知道类型
T
?听起来像是混合C和C++,这是个好主意。由于解释的时间太长,我不能使用模板类。然后,我的解决方案是将我需要的数据存储在这个“通用”指针中。但正因为如此,我不知道真正的类型。为什么仅仅将你的
uchar*
转换为
t*
是不够的?如果你知道数组的大小和
T
(如你所说)的大小,而不知道数组中元素的数量,那么你是安全的,为什么问题的标题中有“C”,但被标记为“C++”?有人不停地进行上下投票,愿意评论为什么?有人不停地进行上下投票,愿意评论为什么?