错误:"在文件范围内可变修改的'd'"

3

代码1:

int size;

struct demo
{
    int a;
};

int main()
{
    scanf("%d",&size);
    struct demo d[size];
    return 0;
}

这段代码运行正常。
代码2:
int size;

struct demo
{
    int a;
};

int main()
{
    scanf("%d",&size);
    return 0;
}

struct demo d[size];

这段代码显示了一个错误:
error : variably modified 'd' at file scope

为什么在代码2中出现这样的错误,而代码1运行正常?

1
可能是重复的问题:C语言中在文件作用域下使用可变长度数组 - Peter Mortensen
并且在大多数(全部?)C的版本中,使用const int size;不会有任何区别(不像C++)。 - Peter Mortensen
这段代码运行正常。或者是未定义行为(UB)? - Peter Mortensen
3个回答

3
因为第二个例子中的d数组是全局的,它不能是一个可变长度的数组。这些数组在运行时才能确定其实际大小,而对于全局数组来说这是不可能的。
编译器必须能够为全局数据分配可执行文件中的空间,如果大小未知,则无法实现这一点。

3

在代码2中,你的结构体数组位于数据段,根据定义:

数据段是程序虚拟地址空间的一部分,其中包含由程序员初始化的全局变量和静态变量。 该段的大小由程序员在编译或汇编程序之前放置在此处的值确定,并且在运行时不会改变


3

函数内声明的变量是栈变量,在函数调用时分配。另一方面,全局变量是在任何函数执行之前分配的堆变量。这就是为什么在第二段代码中,不可能为数组d分配内存。


第一个代码示例可能会编译,但它是否具有预期的行为? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接