以下代码片段使用标准gcc
正确编译。这里可能存在哪些陷阱? --特别是对于内核级开发。
int n;
f(){n=2;}
g(){int b[n];}
main(){
int a[n];
f();
g();
}
最佳答案
这是无效代码,因为可变长度数组的大小可能不等于 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();
}
考虑到 VLA 是在 C99 中引入的,同时标准禁止了函数的默认返回类型 int
。
关于c - C 中可变大小数组的陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31844223/