2

嗨,当我尝试使用用户将在命令行中输入的全局变量的数组大小分配结构时,我得到编译错误,然后将值传递回全局声明的变量。

这里只是示例代码

#include<stdlib.h>
#include<stdio.h>

int Type;

struct list_el {
    int val;
} list1[Type];

struct list_el item;

int main() {
    Type = 10; //just sample
}

错误

在文件范围结构 C 中修改的变量

有没有办法解决这个问题?我需要它在全球范围内工作。

非常感谢。

4

4 回答 4

3

声明数组时,您需要一个大小的编译时常量,而Type事实并非如此。

如果要在运行时分配,请使用指针和malloc.


好吧,实际上您可以为数组大小设置非常量变量,这称为变长数组。使用全局变量的大小的问题是全局变量被初始化为零,所以你正在做的实际上是创建一个具有零元素的数组,但前提是变量Type在创建数组之前被初始化。

于 2013-10-17T08:11:37.130 回答
2

您的代码无效:您不能使用变量作为大小声明数组,然后再分配给变量。

或者,你可以,但数组肯定不会神奇地改变。

此外,变量和数组是全局的也很奇怪。

你可能应该这样做:

int main(void)
{
  int num;

  printf("enter size:\n");
  if(scanf("%d", &num) == 1 && num > 0)
  {
    struct list_el list1[num];

    /* here, work with the array. */
  }
}

请注意,使用这样的变量是 C99 功能。

于 2013-10-17T08:11:49.947 回答
1

如果您希望list和它的大小Type都是全局动态分配的,您需要这样做:动态分配

#include<stdlib.h>
#include<stdio.h>

int Type;

struct list_el {
    int val;
} *list;

int main() 
{
    Type = 10;

    list = malloc(Type * sizeof(*list));

}

也就是说,严重质疑您是否在全球范围内需要这些。如果您的编译器支持它,您可以使用局部可变长度数组 (VLA)。它是 C99 的可选功能,可通过检查__STDC_NO_VLA__是否未定义来进行测试。

于 2013-10-17T08:20:19.887 回答
0

您可以在 main 中使用 alloca() 来堆栈分配内存。

struct list_el {
  int n;
} *list;
static int Type;

int main(int argc, char** argv) {
  Type = argc;
  list = alloca(sizeof(struct list_el) * Type);

  // use list...
}

内存将保持在范围内,直到 main() 返回。我不知道atexit()回调中会发生什么。这是一个有趣的问题。

于 2013-10-17T17:34:31.867 回答