C语言 错误:“在文件范围内可变地修改了'd'”

h5qlskok  于 2023-08-03  发布在  其他
关注(0)|答案(3)|浏览(113)

代码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


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

kt06eoxx

kt06eoxx1#

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

hujrc8aj

hujrc8aj2#

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

8cdiaqws

8cdiaqws3#

因为第二个例子中的d数组是全局的;它不能是可变长度数组。它们直到运行时才得到它们的实际大小,这对于全局变量是不可能的。
编译器必须能够在可执行文件中为全局数据分配空间,如果大小未知,这就变得不可能。

相关问题