c - 运行时大小数组和帧大小扣除

标签 c arrays dynamic

代码:

#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/

相关文章:

比较两个输入的数字是否相同

c - 使用按位运算符生成特定的位模式

python - numpy 数组形状更改/扩展

javascript - 如何获取从过去日期到现在的月份和年份 JavaScript

javascript - 使用 <use> 动态创建时,SVG <animate> 不起作用

C GLubyte 数组

c - 为逐跳扩展 header IPv6 指定新选项?

c++ - 谷歌测试比较指针数组的内容

C:按升序创建队列

php - 使用 PHP 动态赋予列表项 <li> 一个唯一的类