c - C 中可变大小数组的陷阱

标签 c arrays gcc variable-length-array

以下代码片段使用标准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/

相关文章:

c++ - 如何在 C++ 中通过引用传递堆栈矩阵

c++ - 在 "order"中为客户端和服务器显示发送和接收的聊天消息

c - "while()"功能?

c - 有没有办法规范化不存在文件的文件路径?

c - Valgrind 段错误无效写入大小 8 C

java - 使用 statement.setArray() 将 Scala Option[List[_]] 传递给 Java JDBC Array

c - 如何使用结构指针访问结构内部的数组

c - zfile_stable 中的 stable 是什么意思 - CZMQ

Linux - Yum 安装 GCC - 缺少内核头文件

c - gcc 内联汇编的奇怪行为?