【问题标题】:Pitfalls of a variable size array in C [closed]C中可变大小数组的缺陷[关闭]
【发布时间】:2015-08-05 23:01:28
【问题描述】:

以下 sn-p 使用标准 gcc 正确编译。这里有什么可能的陷阱? --尤其是内核级开发

int n;

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

main(){
        int a[n];
        f();
        g();
}

【问题讨论】:

  • 无法编译 (2 : error: variably modified 'c' at file scope)。
  • n 在编译时为 0,并且 int c[n] 将是一个零长度数组,因为结构在编译时被解析。
  • 由于内核结构通常必须比引发它们的调用寿命更长,因此即使分配在内核堆栈上(无论如何大小都是有限的),它的用处似乎也很有限。当然,无论如何,全局 VLA 没有意义(或编译):(
  • 这些不是符合标准的函数定义。他们将 not 在没有警告的情况下编译 gcc 5.1+

标签: c arrays gcc variable-length-array


【解决方案1】:

这是无效代码,因为可变长度数组的大小可能不等于 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(s) 是在 C99 中引入的,同时标准抑制了函数的默认返回类型 int

【讨论】:

  • 谁如此聪明以至于否决了答案?
  • @Ali Abbasinasab 是你投了反对票吗?
  • 你为什么删除我的答案?你为什么要停用我的帐户?有趣的个性!
  • @Ali Abbasinasab 我第一次听到这个。我对删除您的答案和停用您的帐户没有任何共同之处。不是我。
猜你喜欢
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2019-12-02
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多