错误:可变大小的对象不能用c语言初始化。常数int和它有关系吗?

错误:可变大小的对象不能用c语言初始化。常数int和它有关系吗?,c,C,这是我课本上的一个例子,但当我试图运行它时,它会显示错误。我不明白问题出在哪里 const int n=20, d=11; int pergjigjet[n]={1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7}; int denduri[ d ]={0}; for( int p=0; p<n; p++) ++denduri[pergjigjet[p]]; printf("vleresimi\tdendu

这是我课本上的一个例子,但当我试图运行它时,它会显示错误。我不明白问题出在哪里

const int n=20, d=11; 
int pergjigjet[n]={1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7}; 
int denduri[ d ]={0};

for( int p=0; p<n; p++)
  ++denduri[pergjigjet[p]]; 

printf("vleresimi\tdenduria\n"); 
for(int v=1; v<d; v++)
  printf("%d\t\t\%d\n", v, denduri[v]);

这本教科书是错误的;代码不是有效的C

根据6.7.9初始化,^3:

要初始化的实体类型应为大小未知的数组或不是可变长度数组类型的完整对象类型

数组
pergjigjet
是可变长度数组,因为元素数的表达式
n
不是整数常量表达式<代码>常量-限定对象不是常量;它们只是试图修改它们的对象(取决于使用的方法)违反约束或未定义行为

您可以通过替换
const int n=20,d=11来修复它
枚举{n=20,d=11}或使用预处理器宏(
#define n 20
),但这通常被认为是不好的风格


正如Mike Christensen在评论中指出的,这本教科书似乎相当糟糕。作者可能是在C++中的C类子集中编写的,而不是C中的。这个代码在C++中是有效的,因为在C++中,这样的<代码> n< /代码>是常数。

<代码>可变大小的对象可能不会初始化 <代码> \%D也是无效的(未知转义序列)我开始觉得这本教科书不是很好。@MikeChristensen^^
Compilation failed due to following error(s). main.c: In function ‘main’:
main.c:15:5: error: variable-sized object may not be initialized
     int pergjigjet[n]={1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7}; 
     ^
main.c:15:24: warning: excess elements in array initializer
     int pergjigjet[n]={1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7}; 
                    ^