繁体   English   中英

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

[英]variable modified at file scope Struct C

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

这只是示例代码

#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中修改的变量

反正有解决此问题的方法吗? 我需要它在全球范围内运作。

非常感谢。

声明数组时,您需要一个编译时常量作为大小,而Type不是。

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


好吧,实际上您可以为数组大小设置非常数变量,这称为可变长度数组 使用全局变量作为大小的问题是全局变量被初始化为零,因此您实际上是在创建一个包含零个元素的数组,但前提是要在创建数组之前初始化变量Type

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

或者,您可以,但是阵列肯定不会发生神奇的变化。

同样,让变量和数组为全局变量也很奇怪。

您可能应该这样做:

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功能。

如果您希望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__检查测试。

您可以在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()回调中会发生什么。 这是一个有趣的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM