我对 C 中的数组声明有点困惑。我知道可以这样做:
int a[20]; // Reserved space for 20 int array
int b[] = {32, 431, 10, 42}; // Length in square brackets is auto-calculated
int *c = calloc(15, sizeof(int)); // Created a pointer to the dynamic int array
但是可以这样做吗?:
int my_array[sizeof(int) * 5];
它是一个有效的代码,还是一个数组长度应该是一个常量表达式(在 ANSI C 中)?
本声明
int my_array[sizeof(int) * 5];
没有声明变长数组,因为表达式sizeof(int) * 5
是一个常量整数表达式。因此,即使您的编译器不支持可变长度数组,您也可以使用这样的声明。
来自 C 标准(6.6 常量表达式)
6 整数常量表达式117) 应具有整数类型并且应
仅具有整数常量、枚举常量的操作数,
字符常量、结果为整数的 sizeof 表达式
常量和作为立即操作数的浮点常量
演员表。整数常量表达式中的强制转换运算符只能
将算术类型转换为整数类型,除非作为
sizeof 运算符的操作数。
和(6.7.6.2 数组声明符)
4 如果不存在大小,则数组类型是不完整类型。如果
大小是 * 而不是表达式,数组类型是 a
未指定大小的变长数组类型,只能使用
在具有函数原型范围的声明或类型名称中;这样的
尽管如此,数组仍然是完整的类型。如果大小是整数
常量表达式和元素类型具有已知的常量大小,
数组类型不是变长数组类型;否则,
数组类型是变长数组类型。 (变长数组
是实现不需要支持的条件功能;看6.10.8.3.)
可变长度数组的声明可以类似于
const int n = 5;
int my_array[sizeof(int) * n];
在 C11 及更高版本中,可变长度数组的支持是可选的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)