将指针重新分配给多维数组C.

时间:2013-12-15 17:19:11

标签: c pointers multidimensional-array

我正在尝试重新指定一个指向三维数组的指针。

include <stdio.h>

int main()
{
int type;

char database_of_names[3][50][16];
char database_of_suffixes[10][50][16];

char (*databaseP)[][50][16];

...

if(type == 0)
    (*databaseP)[][50][16] = &database_of_names; // Runtime error
else if(type ==1)
    (*databaseP)[][50][16] = &database_of_suffixes; // Runtime error

...

return 0;
}

我可以在声明点初始化指针,如下所示:

char (*databaseP)[][50][16] = &database_of_names; // works

但我希望能够切换作业。如何通过更改上面的代码来完成此操作?

由于

4 个答案:

答案 0 :(得分:2)

更改

(*databaseP)[][50][16] = &database_of_names;  

databaseP = &database_of_names;

答案 1 :(得分:1)

  

我正在尝试重新指定一个指向三维数组的指针。

然后重新分配指针,而不是它指向的随机存储空间(因为它未初始化)。你不需要取消引用它。

databaseP = &database_of_names;

绰绰有余。

答案 2 :(得分:1)

使用

(*databaseP)[][50][16] = &database_of_names

首先取消引用指针,然后尝试对其进行索引。不要这样做,只需指定指针:

databaseP = &database_of_names;

答案 3 :(得分:1)

虽然其他答案的更改会使您显示的代码编译,但您可能想要的是将databaseP的定义更改为:

char (*databaseP)[50][16];

以及databaseP的分配:

if (type == 0)
    databaseP = database_of_names;
else if (type ==1)
    databaseP = database_of_suffixes;

这样做的原因是,尽管其他答案中建议的更改确实会将databaseP设置为指向database_of_namesdatabase_of_suffixes,但它将是指向这些数组的指针。这意味着您必须使用额外的解除引用运算符,如:

… (*databaseP)[i][j][k] …

但是,在C中,指向数组的第一个元素而不是数组本身通常更方便。在这种情况下,三维阵列的第一个元素是二维阵列。我上面展示的代码将databaseP定义为指向二维数组的指针并为其正确分配。结果是您可以更简单地使用databaseP,如:

… databaseP[i][j][k] …

顺便提一下,您在问题中显示的带有“运行时错误”的语句的消息实际上是编译时错误。它们是在编译程序时发生的,而不是在程序运行时发生的。