程序不在C中初始化外部变量

时间:2014-03-08 07:51:17

标签: c

我正在尝试初始化一个空的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 [] [];“

我需要这个列表是全球性的。我没有看到只是在一个单独的函数中初始化数组的问题。我用其他语言做了很多次。

3 个答案:

答案 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
 }