如何创建指向2D数组指针的指针 - C.

时间:2014-04-25 11:22:20

标签: c arrays pointers struct

如何创建指向2D数组的指针?我试图用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是一个结构。

4 个答案:

答案 0 :(得分:2)

  

我似乎无法将数组的所有索引启动为null

使用calloc()。

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

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

答案 1 :(得分:1)

进行以下更改

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

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

为什么会出错?

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

答案 2 :(得分:0)

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

board[i][j] = NULL;

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

BoardObject b = NULL;

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

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

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

BoardObject b = { 0 };

现在,您无法通过malloc为通过BoardObject const b = { 0 }; // ... board[i][j] = b; 分配的内存指定括号括起的初始化列表。但您可以按值复制结构:

calloc

这比使用{{1}}更便携,{{1}}将所有位设置为零。它依赖于系统依赖于浮点类型或指针类型是否为全零位零作为其零值的有效表示,尽管对于常见的现代系统来说也是如此,因此您通常可以使用它。

答案 3 :(得分:-1)

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

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

原因是C没有任何基础对象类型的概念,因此从malloc返回时需要void,以便它可以分配任何类型的内存。

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

我希望这会有所帮助......