C 中的静态数组如何在运行时获取大小?

kis*_*dbn 3 c

我对这个小代码感到震惊:

#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 最近有什么变化吗?根据我的理解,这段代码不应该起作用。

Ted*_*gmo 7

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 就没有。