c - 数组大小作为变量 - 现在正确的是什么?

标签 c arrays gcc

我使用 gcc 来编译我的程序:

$ gcc --version
gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

我知道有不同的 C 标准:

  1. K&R C 标准(经典 C)
  2. ANSI C
  3. ISO 90
  4. ...其中ANSI C和ISO C几乎相同,也称为C90或C89
  5. ANSI C99 和 ISO/IEC 9899 称为 C99
  6. C11(当前 C 标准)

我的观点是,它们在声明静态数组时存在差异。

在 C89 (C90) 中你不能有这样的数组:

#include <stdio.h>

int main(int argc, char **argv)
{
    int n = 4; //or const int n = 4
    int tab1[n] = {1,2,3,4};

    return 0;
}

但在 C99 中,您可以:

#include <stdio.h>
int main(int argc, char **argv)
{
    int n = 4; // or const int n = 4
    int tab1[n] = {1,2,3,4};

    int tab2[3] = {5,6,7};

    return 0;
}

但是当我用 gcc arrays_size.c -std=c99 -o arrays_size 编译这个版本时

#include <stdio.h>
int main(int argc, char **argv)
{
    int n = 4; // or const int n = 4
    int tab1[n] = {1,2,3,4};
    return 0;
}

它给了我:

arrays_size.c: In function ‘main’:
arrays_size.c:6:5: error: variable-sized object may not be initialized
arrays_size.c:6:5: warning: excess elements in array initializer [enabled by default]
arrays_size.c:6:5: warning: (near initialization for ‘tab1’) [enabled by default]
arrays_size.c:6:5: warning: excess elements in array initializer [enabled by default]
arrays_size.c:6:5: warning: (near initialization for ‘tab1’) [enabled by default]
arrays_size.c:6:5: warning: excess elements in array initializer [enabled by default]
arrays_size.c:6:5: warning: (near initialization for ‘tab1’) [enabled by default]
arrays_size.c:6:5: warning: excess elements in array initializer [enabled by default]
arrays_size.c:6:5: warning: (near initialization for ‘tab1’) [enabled by default]

虽然应该是正确的,对吧?与使用 gcc arrays_size.c -o arrays_size ...

编译相同

我的问题:

  1. 什么是正确的做法?
  2. 最新的 C11 怎么样,它是否允许声明一个以变量作为其大小的数组?
  3. 那么其他标准呢?

干杯!

最佳答案

当数组的大小是一个变量时,您不能以这种方式初始化数组。这是行不通的。

int tab1[n] = {1,2,3,4};

但这会:

int tab1[4] = {1,2,3,4};

gcc 接受大小为 n 的字符数组不符合 C89。 gcc 支持它作为扩展。

关于c - 数组大小作为变量 - 现在正确的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20266926/

相关文章:

php - 处理类别和子类别 MySQL 或 JSON

arrays - 将元素添加到列表时出现 Swift 运行时错误?

python - 使用字典转换 tensorflow 数组中的元素

c - 如何使用 "$gcc test.c -o demo"命令编译简单的C代码?

gcc - 即使指定了 -L ld 也找不到共享库

gcc - Newlib 的替代品?

c - X86 64 位程序集 Linux 'Hello World' 链接问题

c++ - Windows 驱动程序 IOCTL 代码蓝屏/使计算机崩溃

c - UART DMA Tx/Rx 架构

c - VDSO(7) 和 SYSCALL(2) 之间有什么关系?