C中可变大小数组的陷阱[关闭]

问题描述 投票:-4回答:1

以下代码段使用标准gcc正确编译。这里有什么可能的陷阱? - 特别适用于内核级开发。

int n;

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

main(){
        int a[n];
        f();
        g();
}
c arrays gcc variable-length-array
1个回答
4
投票

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

这个数组

    int a[n];

由于变量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();
}    

考虑到在C99中引入了VLA,同时标准抑制了函数的默认返回类型int

© www.soinside.com 2019 - 2024. All rights reserved.