有一个作业,我应该使用以下结构:
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];
不是必须是:newNatset.bits = bArrayRoll[0][0]吗?
这又是一个类型不兼容的赋值。您正在将 unsigned char
分配给 unsigned char*
。不过你可以这样做,
newNatset.bits = &bArrayRoll[0][0];
尝试将结构体中的指针分配给二维数组? (你想要的东西)。
那么你需要这样做,
unsigned char (*p)[byteNum] = bArrayRoll;
但在结构中,您已将 bits
声明为 unsigned char*
类型,而不是 unsigned char (*)[byteNum]
类型.
好吧,如果您不明白我们在最后一种情况下分配时发生了什么以及类型如何匹配 - 那么这里是关键思想。
二维数组衰减为指向第一个元素的指针 - 这是一个由 byteNum
无符号字符组成的一维数组。现在我们将它分配给 p
,这又是
unsigned char (*)[byteNum]
^ ^
1 2
\-----------/
3
Pointer to (1) an array of bytenum (2) unsigned characters (3).
关于c - 尝试将结构体中的指针分配给二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47953681/