我正在尝试初始化一个空的2维指针数组,指向我创建的称为“node”的数据结构。出于某种原因,当我试图修改列表时,我遇到了这个范围问题,这是该程序的关键部分。一个名为“repository_init”的函数应该真正初始化数组。但是,我在其他函数中使用数组,这就是我收到错误的原因。它无法识别数组是否存在。我是C的新手,但经过一些研究后,我在“extern”上找到了一些东西,该网站告诉我,我可以使用extern来声明一个空变量。因此,我将我的列表声明为全局变量,方法是将它放在main之前并像这样编写它:
extern node *main_list[][];
#define MAX_LEVEL 10000
这是repository_init()函数:
void repository_init(int p){
int new;
new = (max_range/2) + 5;
max_height = 1;
while(new > 1){
new = (new * probability)/100;
max_height++;
}
main_list[max_height][MAX_LEVEL];
/*fill the array with empty values*/
}
输出到屏幕的错误是“错误:数组类型具有不完整的元素类型
extern node * main_list [] [];“
我需要这个列表是全球性的。我没有看到只是在一个单独的函数中初始化数组的问题。我用其他语言做了很多次。
答案 0 :(得分:2)
问题是双重的:第一个是main_list
的声明是不完整的,正如编译器告诉你的那样。在声明数组时,您需要数组的大小。第二个问题是使用这个不完整数组的表达式 main_list[max_height][MAX_LEVEL];
。它没有设置大小,它试图访问数组。
在你的情况下,它可能最好通过指针指针来解决。像
这样的东西extern node ***main_list;
...
main_list = malloc(sizeof(node **) * max_height);
for (size_t i = 0; i < max_height; ++i)
main_list[i] = malloc(sizeof(node *) * MAX_LEVEL);
答案 1 :(得分:0)
你的声明不是数组。
It's a pointer to 2D array
。如果没有定义其大小(在使用指针概念时至少是行),则无法声明指向2D数组的指针。
如果您想要2D数组,请将其声明如下: -
extern node main_list [] [];
如果你想要一个2D指针尝试使用三重指针
extern node *** main_list;
注意: - 数组大小是在编译时计算的,因此编译器必须知道它的大小。
答案 2 :(得分:0)
来自C99
标准,第6.2.5节,第20条 -
数组类型描述了连续分配的非空集 具有特定成员对象类型的对象,称为元素类型。 数组类型的特征在于元素类型和数字 数组中的元素。据说数组类型是从它派生的 元素类型,如果其元素类型为
T
,则数组类型为 有时称为array of T
。
它进一步说明了脚注#36 -
由于对象类型不包含不完整类型,因此数组为 不完整的类型不能构建。
这意味着概念上1-D阵列和2-D阵列等之间没有区别。它们都是相同的类型 - array type
。以下陈述
extern node *main_list[][];
旨在声明未知大小的main_list
类型的数组node *[]
。
类型node *[]
本身就是一个数组类型,但它的大小不知道,因此它是一个不完整的类型。您可以声明一个未知大小的数组,该数组将使用其外部定义进行解析,但您不能声明一个不完整类型的数组,如上面引用的标准中明确说明的那样。数组元素的类型必须是完整类型。这解释了错误陈述。
这是我的建议 -
// header file myheader.h
#define MAX_LEVEL 10000
extern node *main_list[][MAX_LEVEL];
我建议不要使用new
之类的变量名,这是许多语言中的关键字,可能会引起混淆。此外,您可以使用NULL
初始化数组。
// myfile.c
void repository_init(int p) {
int newval;
newval = (max_range / 2) + 5;
max_height = 1;
while(newval > 1) {
newval = (newval * probability) / 100;
max_height++;
}
// definition of the array. specifies the array size
// and allocates memory on the stack. size is resolved with
// the extern declaration of the array main_list.
// initialize all elements of the array to NULL.
node *main_list[max_height][MAX_LEVEL] = {0};
// process the array main_list
}