有一个我应该使用以下结构的作业:
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;
但是,编译器返回“从不兼容的指针类型分配”或“从不兼容的指针类型初始化”。
如何正确地将位指针分配给此数组?
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).