【问题标题】:Program not initializing extern variable in C程序未在 C 中初始化外部变量
【发布时间】:2014-03-08 07:51:17
【问题描述】:

我正在尝试初始化一个空的二维指针数组,这些指针指向我创建的称为“节点”的数据结构。出于某种原因,我在尝试修改列表时遇到了这个范围问题,这是程序的关键部分。一个名为“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*/
     }

错误输出到屏幕是“错误:数组类型有不完整的元素类型

外部节点 *main_list[][];"

我需要这个列表是全球性的。我看不出仅在单独的函数中初始化数组有什么问题。我已经用其他语言做了很多次了。

【问题讨论】:

  • 如果以后要设置大小,需要将其存储为节点***而不是数组。

标签: c


【解决方案1】:

问题是双重的:首先是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);

【讨论】:

    【解决方案2】:

    你声明的不是数组。

    It's a pointer to 2D array。您不能在不定义其大小的情况下声明指向 2D 数组的指针(至少在使用指针概念时是行)。

    如果你想要二维数组,声明如下:-

    外部节点 main_list[][];

    如果您想要指向 2D 的指针,请尝试使用三重指针

    外部节点 ***main_list;

    注意:- 数组大小是在编译时计算的,所以编译器必须知道它的大小。

    【讨论】:

      【解决方案3】:

      来自C99 标准,第 6.2.5 节,第 20 条 -

      数组类型描述了一个连续分配的非空集合 具有特定成员对象类型的对象,称为元素类型。 数组类型的特征在于它们的元素类型和数量 数组中的元素。数组类型据说是从它的 元素类型,如果其元素类型为T,则数组类型为 有时称为array of T

      它在脚注 #36 中进一步说明 -

      由于对象类型不包括不完整类型,因此数组 无法构造不完整的类型。

      这意味着从概念上讲,一维数组和二维数组等之间没有区别。它们都是相同的类型 - array type。以下声明

      extern node *main_list[][];
      

      旨在声明一个未知大小的node *[] 类型的数组main_listnode *[] 类型本身是一个数组类型,但它的大小是未知的,因此它是一个不完整的类型。您可以声明一个大小未知的数组,该数组将通过其外部定义进行解析,但您不能声明一个不完整类型的数组,正如上面引用的标准中明确规定的那样。数组元素的类型必须是完整类型。这解释了错误声明。 这是我的建议 -

      // 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
       }
      

      【讨论】:

        猜你喜欢
        • 2022-06-15
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 2012-10-03
        相关资源
        最近更新 更多