使用memcpy复制不同类型的数组



我读过这个、这个和这个,但没有一个回答我想知道的

从硬件返回一组PId(每个3个字节),该PId被保存到原始阵列(buffer)中。这个设备正好返回84个字节。

然后我需要将这些PId复制到一个或多个数组中,该数组可由该设备的API库读取。

这是我的代码

#pragma pack (1)
typedef unsigned char PId[3];
typedef PId PIDs[28];
int GetList(PId* plist){
unsigned char buffer[84];
//... Reads the data from hardware memory to buffer
if (RunCMD(0xCD, &buffer)){
// buffer has the correct data now 'AAAA...'
memcpy(&plist,buffer, 84);
printf("%02X%02X%02Xn", buffer[0], buffert[1], buffer[2]); 
printf("%02X%02X%02Xn", buffer[3], buffer[4], buffer[5]); 
return 0;
} 
return 1;
}
int main(void) {
...
PId plist_a;
GetList(&plist_a);
printf("%02X%02X%02Xn", plist_a[0][0], plist_a[0][1], plist_a[0][2]); 
printf("%02X%02X%02Xn", plist_a[1][0], plist_a[1][1], plist_a[1][2]); 
...
}

不知何故,此代码没有将正确的数据复制到PIDs数组。buffer具有适当的数据,但在memcpy之后,pids不具有相同的数据。

我知道我做错了什么,但我找不到。

如果有帮助的话,我将使用windowsGCCARM CPU编译代码

编辑:我很抱歉让大家感到困惑,实际上代码是有效的,但我错过了代码的一部分。我纠正了。pids不是PIDs类型,而是指向它的指针

看看这个问题的答案。您可能不想直接使用数组的typedefs。

试试这样的东西:

声明:

#pragma pack (1)
typedef struct PId
{
unsigned char pid[3];
} PId;

typedef struct PIDs
{
PId pids[28];
} PIDs;

然后,对于memcpy。。。

其他人指出,您正在传递指针,如PId* plist,但您正在尝试使用类似memcpy(&plist, buffer, 84);的memcpy。&符号会把你弄得一团糟,因为它指的是指针本身的地址。你想要的是:

//plist should probably be a pointer to PIDs, not PId
int GetList(PIDs* plist){
unsigned char buffer[84];
//... Reads the data from hardware memory to buffer
if (RunCMD(0xCD, &buffer)){
// buffer has the correct data now 'AAAA...'
//remove the & symbol
memcpy(plist,buffer, 84);
//etc
}
请注意,对于数组,您不需要传递的地址。只做
memcpy(pids, buffer, 84);

我很困惑为什么会编译它。代替

typedef PIDs PId[28];

你需要

typedef PId PIDs[28];

使用typedef,可以将新类型的名称放在变量通常所在的位置。

这可能有效:

#pragma pack (1)
struct PId{
unsigned char pid[3];
};
int main(){    
unsigned char buffer[84];
struct PId pids[28];
/* buffer gets populated somewhere here */    
memcpy(pids, buffer, 84);
}

最新更新