繁体   English   中英

如何创建指向二维指针数组的指针 - C

[英]How do I create a pointer to a 2D array of pointers - C

如何创建指向二维指针数组的指针? 我正在尝试使用 main 之外的不同方法来改变 2D 数组,并在 main 内部使用它。 我很幸运地创建了一个指向 2D 数组的指针,但我似乎无法将数组的所有索引初始化为 null。 除非我将数组传递给方法,否则我似乎也无法赋值。 这是我尝试过的:

BoardObject ** board;
board = malloc(BOARD_SIZE * sizeof(BoardObject));

for (int i = 0; i < BOARD_SIZE; i++){
    board[i] = malloc(BOARD_SIZE * sizeof(BoardObject));
}
for (int i = 0; i < BOARD_SIZE; i++){
    for (int j = 0; j < BOARD_SIZE; j++){
        board[i][j] = NULL;
    }
}

我收到一条错误消息,指出我无法将类型 *void 分配给 BoardObject。 我可能做错了,但似乎在堆栈交换中找不到任何类似的问题。 如果可能,请向我解释解决方案。 谢谢!

注意:BoardObject 是一个结构体。

我似乎无法将数组的所有索引初始化为 null

使用 calloc()。

board = malloc(BOARD_SIZE * sizeof(BoardObject));

这段代码说“采用一个指向指针的指针并让它指向一个 BOARD_SIZE 对象数组”。 如果你想创建一个指针数组,那没有任何意义。 您应该已经分配了sizeof(BoardObject*)

进行以下更改

board = malloc(BOARD_SIZE * sizeof(BoardObject*));

每个board[i]都是一个指向BoardObject的指针。

为什么会报错?

因为, board[i][j]BoardObject类型,而不是BoardObject * NULL被定义为(void *)0 因此,您不能分配和指向BoardObject 相反,按照其他人的解释使用 memset 或 calloc。

只是解决似乎是主要问题:

board[i][j] = NULL;

board[i][j]表示BoardObject 此代码具有与以下相同的问题:

BoardObject b = NULL;

希望很清楚为什么这不起作用: BoardObject是一个struct ,所以你唯一可以用大括号括起来的初始化列表来初始化它,例如

BoardObject b = { 1, "foo", 5.5 };

或者,如果您将对象设计为使用所有零初始化的字段,

BoardObject b = { 0 };

现在,您无法为通过malloc分配的内存指定大括号括起来的初始化列表。 但是您可以按值复制结构:

BoardObject const b = { 0 };
// ...
board[i][j] = b;

这比使用calloc更便携,后者将所有位设置为零。 浮点类型或指针类型是否具有所有位为零作为其零值的有效表示形式取决于系统,尽管对于常见的现代系统来说确实如此,因此您通常会侥幸逃脱。

malloc 返回一个空指针,然后您必须将其转换为所需的类型。 在这种情况下...

board = (BoardObject**) malloc( ( BOARD_SIZE * BOARD_SIZE ) * sizeof(BoardObject ) );

这样做的原因是 C 没有任何基本 Object 类型的概念,因此从 malloc 返回需要 void,以便它可以分配任何类型的内存。

您还需要为您的电路板分配更多空间,如循环中所示,如我上面的示例代码所示...

我希望这有帮助...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM