我对这个小代码感到震惊:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这个程序究竟如何不会出现段错误,因为限制(数组的大小)仅在运行时分配?
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
Run Code Online (Sandbox Code Playgroud)
请注意,自 C11 以来,VLA:s 是可选的,因此并非所有 C 编译器都支持它。例如,MSVC 就没有。
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |