代码:
#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;
}
这段代码是如何编译的?更具体地说:如果在编译时不知道局部变量main
的大小,编译器如何知道帧foo
的大小是多少。我期待编译错误:&#34; foo
类型不完整&#34;
还要tried代码,它也运行良好:
答案 0 :(得分:3)
在您的代码中,您将首先读取数据以指定数组元素的大小,然后它将在堆栈上分配该数组。
这种方法可从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;
}