【问题标题】:Array of runtime size and frame size deduction运行时大小和帧大小扣除的数组
【发布时间】:2017-11-10 05:09:59
【问题描述】:

代码:

#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 的类型不完整”

还有tried的代码,它也运行良好:

【问题讨论】:

标签: c arrays dynamic


【解决方案1】:

在您的代码中,您将首先读取数据以指定数组元素的大小,然后它将在堆栈上分配该数组。

这种方法可从 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;
}

【讨论】:

  • 这是否意味着在函数调用期间堆栈指针会增加两次?第一次为局部变量大小,第二次以sizeof(foo[size])? 递增
  • 是的,确实如此。请检查我的第二个示例。使用它会更好。
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2012-12-27
相关资源
最近更新 更多