gpt4 book ai didi

c - C中的静态数组如何在运行时占用大小?

转载 作者:行者123 更新时间:2023-12-05 01:53:07 26 4
gpt4 key购买 nike

我被这个小代码迷住了:

#include <stdio.h>

int main()
{
int limit = 0;
scanf("%d", &limit);
int y[limit];

for (int i = 0; i<limit; i++ ) {
y[i] = i;
}

for (int i = 0; i < limit; i++) {
printf("%d ", y[i]);
}

return 0;
}

由于限制(数组的大小)仅在运行时分配,所以这个程序到底怎么才不会出现段错误?

C 最近有什么变化吗?根据我的理解,这段代码不应该起作用。

最佳答案

int y[limit]; 是一个可变长度数组(或简称 VLA),是在 C99 中添加的。如果支持,它会在堆栈上分配数组(在具有堆栈的系统上)。它类似于使用依赖于机器和编译器的 alloca 函数(在 MSVC 中称为 _alloca):

例子:

#include <alloca.h>
#include <stdio.h>

int main()
{
int limit = 0;
if(scanf("%d", &limit) != 1 || limit < 1) return 1;

int* y = alloca(limit * sizeof *y); // instead of a VLA

for (int i = 0; i<limit; i++ ) {
y[i] = i;
}

for (int i = 0; i < limit; i++) {
printf("%d ", y[i]);
}
} // the memory allocated by alloca is here free'd automatically

请注意,自 C11 以来,VLA:s 是可选的,因此并非所有 C 编译器都支持它。例如 MSVC 就没有。

关于c - C中的静态数组如何在运行时占用大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71219457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com