我正在尝试重新指定一个指向三维数组的指针。
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
但我希望能够切换作业。如何通过更改上面的代码来完成此操作?
由于
答案 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_names
或database_of_suffixes
,但它将是指向这些数组的指针。这意味着您必须使用额外的解除引用运算符,如:
… (*databaseP)[i][j][k] …
但是,在C中,指向数组的第一个元素而不是数组本身通常更方便。在这种情况下,三维阵列的第一个元素是二维阵列。我上面展示的代码将databaseP
定义为指向二维数组的指针并为其正确分配。结果是您可以更简单地使用databaseP
,如:
… databaseP[i][j][k] …
顺便提一下,您在问题中显示的带有“运行时错误”的语句的消息实际上是编译时错误。它们是在编译程序时发生的,而不是在程序运行时发生的。