有一个我应该使用以下结构的作业:
typedef struct natset{
unsigned long min;
unsigned int size;
unsigned char* bits;
}natset_t;
现在我必须将该指针分配给以下二维无符号字符数组:
unsigned char bArrayRoll[7][byteNum];
我尝试过这样做:
unsigned long min = 20;
unsigned int size = 20;
unsigned char bArrayRoll[7][byteNum];
natset_t newNatset;
newNatset.min = min;
newNatset.size = size;
newNatset.bits = &bArrayRoll;
我尝试过的newNatset.bits的变体包括:
newNatset.bits = bArrayRoll;
newNatset.bits* = &bArrayRoll;
但是,编译器返回“从不兼容的指针类型分配”或“从不兼容的指针类型初始化”。
如何正确地将位指针分配给此数组?
答案 0 :(得分:0)
newNatset.bits* = &bArrayRoll;
您正试图将newNatset.bits
乘以bArrayRoll
的地址,这是未定义的行为。
newNatset.bits = bArrayRoll;
这里的这个试图将unsigned char (*)[byteNum]
分配给unsigned char*
,这又是关于哪个编译器抱怨的东西。类型明显不兼容。
正确一个(根据编译器更正)
newNatset.bits = bArrayRoll[0];
这又是一种不兼容的类型。您正在为unsigned char
分配unsigned char*
。你可以这样做,
newNatset.bits = &bArrayRoll[0][0];
然后你需要这样做,
unsigned char (*p)[byteNum] = bArrayRoll;
但在结构中,您已将bits
声明为unsigned char*
类型,而不是类型unsigned char (*)[byteNum]
。
如果您不理解我们在最后一个案例中分配的内容以及类型是如何匹配的 - 那么这就是关键想法。
2d数组衰变为指向第一个元素的指针 - 这是byteNum
无符号字符的单维数组。现在我们将它分配给p
,这又是
unsigned char (*)[byteNum]
^ ^
1 2
\-----------/
3
Pointer to (1) an array of bytenum (2) unsigned characters (3).