错误“变量在文件范围Struct C修改”[重复]

h22fl7wq  于 2023-08-03  发布在  其他
关注(0)|答案(4)|浏览(96)

此问题在此处已有答案

Variably modified array at file scope in C(4个答案)
4天前关闭。
当我试图将用户将在命令行中输入的全局变量的数组大小分配给结构体,然后将值传递回全局声明的变量时,我会得到一个编译错误。
下面是示例代码:

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

int Type;

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

struct list_el item;

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

字符串
错误代码:
在文件范围修改的变量
有办法解决这个问题吗?我需要它在全球范围内发挥作用。

4uqofj5v

4uqofj5v1#

当声明一个数组时,需要一个编译时常量来表示大小,而Type不需要。
如果你想在运行时分配,使用指针和malloc
实际上,你可以用非常量变量来表示数组大小,它叫做variable-length arrays。使用全局变量作为大小的问题是全局变量被初始化为零,所以你所做的实际上是创建一个零元素的数组,但前提是变量Type在创建数组之前被初始化。

rslzwgfq

rslzwgfq2#

您的代码无效:你不能 * 首先 * 声明一个数组,使用一个变量作为大小,然后 * 再 * 赋值给这个变量。
或者,你可以,但数组肯定不会神奇地改变。
另外,让变量和数组是全局的也很奇怪。
你也许应该这样做:

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的特性。

vulvrdjw

vulvrdjw3#

如果你希望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**是否 * 未 * 定义来测试。

iklwldmw

iklwldmw4#

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

相关问题