C 中可变大小数组的陷阱

ali*_*nia -4 c arrays gcc variable-length-array

以下代码段使用标准正确编译gcc。这里可能存在哪些陷阱?--特别是对于内核级开发

int n;

f(){n=2;}
g(){int b[n];}

main(){
        int a[n];
        f();
        g();
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 5

这是无效代码,因为可变长度数组的大小可能不等于 0。在您的示例中,文件范围变量n由 0 初始化。

这个数组

    int a[n];
Run Code Online (Sandbox Code Playgroud)

大小为零,因为变量n被零初始化为具有静态存储持续时间。

要获得有效的程序,您应该编写如下内容

#include <stdio.h>

int n;

void f( void ){n=2;}
void g( void ){int b[n]; printf( "sizeof( b ) = %zu\n", sizeof( b ) ); }

int main( void )
{
        f();
        int a[n];
        printf( "sizeof( a ) = %zu\n", sizeof( a ) );
        g();
}    
Run Code Online (Sandbox Code Playgroud)

考虑到 VLA(s) 是在 C99 中引入的,同时标准禁止了int函数的默认返回类型。