当我尝试为结构分配全局变量的数组大小时,我会得到编译错误,用户将在命令行中输入,然后将值传递回全局声明的变量。
以下是示例代码
#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
有没有解决问题的方法?我需要它在全球范围内工作。
非常感谢你。
答案 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()
回调中发生了什么。这是一个有趣的问题。