代码:
#include <stdio.h>
int main() {
int size;
scanf("%d", &size);
int foo[size];
for(int i = 0; i < size; i++)
scanf("%d", &foo[i]);
for(int i = 0; i < size; i++)
printf("%d\n",foo[i]);
return 0;
}
这段代码如何编译?更具体地说:如果在编译时不知道局部变量 foo
的大小,编译器如何知道帧 main
的大小。我期待着这样的编译错误:“foo
has incomplete type”
还有tried代码,它也运行良好:
最佳答案
在您的代码中,您将首先读取数据以指定数组元素的大小,然后它将在堆栈上分配该数组。
此方法可从 C99 开始使用。
编译器如何知道大小?它不知道。如果您为 size
输入太大的值,您可能会发生堆栈溢出。
它将以一种方式编译,确保根据大小变量乘以单个数组元素的大小来创建尽可能大的推送,以将整个数组放入堆栈:
stack_size_usage = size * sizeof (int)
在 C89 中,这会重现错误,因为在执行任何代码之前必须首先初始化所有变量。
我会使用 HEAP 内存来进行这种类型的分配。
#include <stdio.h>
int main() {
int size;
int* foo;
scanf("%d", &size);
foo = malloc(sizeof(*foo) * size);
if (!foo) { /* failed, stop program */ }
for(int i = 0; i < size; i++)
scanf("%d", &foo[i]);
for(int i = 0; i < size; i++)
printf("%d\n",foo[i]);
free(foo);
return 0;
}
关于c - 运行时大小数组和帧大小扣除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44436508/