问题描述
以下代码段在C中是非法的,但在C ++中则可以正常工作。
为什么我们不能使用const来帮助初始化C语言中数组的长度?
#include <stdio.h>
#include <string.h>
int main () {
const int size = 6;
char name[size] = "hello";
printf("%s",name);
return 0;
}
解决方法
在C语言中,大小不是整数常量表达式的数组是可变长度数组,由于无法在编译时知道它们的大小,因此无法初始化此类数组时间。
带有const
限定词的变量不会不计为C中的整数常量表达式,因此使name
成为可变长度数组,导致您尝试时出错对其进行初始化。
const
限定变量,其初始值设定项是整数常量表达式 在C ++中被视为编译时常数,因此可以初始化使用此类变量指定其大小的数组。
,
C标准允许C编译器支持可变长度数组。用作数组大小的变量的const限定词不会在C中生成与C ++相反的常量整数表达式。
来自C标准(6.6常量表达式)
6 整数常量表达式117)应具有整数类型,并且应 仅具有整数常量,枚举常量, 字符常量,其结果为整数的表达式的大小 常量和作为常量的立即数的浮点常量 演员表。整数常量表达式中的强制转换运算符应仅 将算术类型转换为整数类型,但作为 操作数为sizeof运算符。
此引号中的整数或字符常量一词表示文字。
那么对于可变长度数组(C标准6.7.6.2数组声明符)
4如果不存在大小,则数组类型为不完整的类型。如果 大小是*而不是表达式,数组类型是 未指定大小的可变长度数组类型,只能使用 在具有函数原型范围的声明或类型名称中;这样 数组仍然是完整的类型。如果大小是整数 常数表达式,并且元素类型具有已知的常数大小, 数组类型不是可变长度数组类型;否则, 数组类型是变长数组类型。 (可变长度数组 是实现不需要支持的条件功能;看到 6.10.8.3。)
某些C ++编译器可以具有自己的语言扩展,从而也可以在C ++程序中使用可变长度数组。但这不是X ++标准功能。
即使C ++编译器支持可变长度数组,也最好使用标准类模板std::vector
而不是可变长度数组。
请注意,声明它们时,不得在C中初始化可变长度数组。可变长度数组具有自动存储持续时间。您可以将sizeof
运算符应用于在运行时求值的可变长度数组。
这是一个使用可变长度数组的演示程序。
#include <stdio.h>
void f( size_t,size_t,int[][*] );
void f( size_t m,size_t n,int a[][n] )
{
for ( size_t i = 0; i < m; i++ )
{
for ( size_t j = 0; j < n; j++ )
{
a[i][j] = n * i + j;
}
}
}
void g( size_t,int[][*] );
void g( size_t m,int a[][n] )
{
for ( size_t i = 0; i < m; i++ )
{
for ( size_t j = 0; j < n; j++ )
{
printf( "%2d ",a[i][j] );
}
putchar( '\n' );
}
}
int main(void)
{
const size_t m1 = 3,n1 = 3;
int a[m1][n1];
f( m1,n1,a );
g( m1,a );
putchar( '\n' );
const size_t m2 = 4,n2 = 5;
int b[m2][n2];
f( m2,n2,b );
g( m2,b );
putchar( '\n' );
return 0;
}
程序输出为
0 1 2
3 4 5
6 7 8
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19