我使用 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 标准:
- K&R C 标准(经典 C)
- ANSI C
- ISO 90
- ...其中ANSI C和ISO C几乎相同,也称为C90或C89
- ANSI C99 和 ISO/IEC 9899 称为 C99
- 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
...
我的问题:
- 什么是正确的做法?
- 最新的 C11 怎么样,它是否允许声明一个以变量作为其大小的数组?
- 那么其他标准呢?
干杯!
最佳答案
当数组的大小是一个变量时,您不能以这种方式初始化数组。这是行不通的。
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/