c - 尝试将结构体中的指针分配给二维数组

标签 c arrays pointers

有一个作业,我应该使用以下结构:

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.bitsbArrayRoll 的地址相乘,这是未定义的行为。

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/

相关文章:

c - 在创建 RAW_SOCKET 错误时,如不允许操作

javascript - 获取数组中特定参数为空的第一项

javascript - 组合两个数组以形成 JavaScript 对象

python - Python 2 中的字节数组未按预期运行

C++:制作指针 vector 的完整拷贝

c - 为什么 Eclipse 向我的 C 命令行参数添加单引号?

c - 确定大文件中字符串的唯一性

objective-c - 适用于 mac os 10.6 雪豹的 glib

C# 编码(marshal) uint*& 参数

c++ - 以优雅的方式管理指向游戏引擎中被破坏对象的指针