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

时间:2013-10-17 08:09:19

标签: c data-structures struct global-variables

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

以下是示例代码

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

错误

  

在文件范围内修改的变量Struct C

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

非常感谢你。

4 个答案:

答案 0 :(得分:2)

声明数组时,您需要一个编译时常量,Type不是。

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


嗯,实际上你可以拥有数组大小的非常量变量,它被称为variable-length arrays。对全局变量使用大小的问题是全局变量初始化为零,所以你所做的实际上是创建一个零元素的数组,但前提是在创建数组之前初始化变量Type

答案 1 :(得分: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功能。

答案 2 :(得分: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 __ 是否 定义来测试。

答案 3 :(得分: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()回调中发生了什么。这是一个有趣的问题。