为什么可变长度数组在这个C代码中工作?

Ane*_*gra 4 c arrays

#include "stdio.h"

int main()
    {
        int n;
        printf("Enter n:\n");
        scanf("%d",&n);

        int arr[n][n];
        arr[3][3] = 4;
        printf("%d",arr[3][3]);
        getchar();
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

没有使用int arr[n],其中n是变量,在C中是非法的?我想知道这里发生了什么.显然,代码适用于我clang LLVM compiler和IDEOne以及Codeblocks.我想编译器只是通过自动内存分配让事情变得简单.但另一个惊人的事实是,当我尝试设置n为1,2或3时,它仍然有效.

Alo*_*ave 6

自C99起,C标准允许可变长度数组.请注意,C++
标准仍然不允许它们.
另外需要注意的重点是c99之前的版本,对于大多数C++编译器,扩展形式的实现支持可变长度数组.

  • @AneeshDogra因为你正在调用[未定义的行为](http://stackoverflow.com/questions/15646973/how-dangerous-is-it-to-access-an-array-out-of-bounds)并且很幸运(或者不幸,取决于你如何看待它). (2认同)