假设我有一个unsigned char
指针(从现在开始为uchar*
)到T
类型与uchar
不同的数组的开头。知道这个数组的大小并且它是连续的(使用malloc
创建),是否可以在不知道类型T
的情况下将其复制到另一个数组?如何以字节为单位访问它?
由于
答案 0 :(得分:6)
您可以使用简单的memcpy
或memmove
对所有内容进行浅层复制,但最好确保数组元素不是包含任何指针的类对象。或者更准确地说,确保它们是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
的大小(例如,如果你只是递给指针),那么你当然不能这样做,因为你不知道占用了多少内存。没有“字段分隔符”或存储在内存中的任何可以在运行时检查的内容。