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

时间:2011-06-15 08:31:42

标签: c++ arrays pointers

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

由于

2 个答案:

答案 0 :(得分:6)

您可以使用简单的memcpymemmove对所有内容进行浅层复制,但最好确保数组元素不是包含任何指针的类对象。或者更准确地说,确保它们是PODs

答案 1 :(得分:0)

你可以这样做:

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具有非平凡属性(自定义构造函数,指向堆变量的指针等),这有很多可能导致问题,但您当然可以通过这些指针访问原始数据。 (例如,如果你想查看double的二进制表示或类似的东西,这样做可能会很有趣,但在生产代码中很少会出现这种情况。)

如果您的原始对象为T foo[N],请使用尺寸sizeof(T) * N

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