半动态分配代码在c++;,但不是用c,为什么? 下面两个代码在C++文件中工作得很好,但是C中编译错误,为什么? 它似乎使用const变量导致了c中的一些问题, 我使用DEV C++ 5.11

半动态分配代码在c++;,但不是用c,为什么? 下面两个代码在C++文件中工作得很好,但是C中编译错误,为什么? 它似乎使用const变量导致了c中的一些问题, 我使用DEV C++ 5.11 ,c,C,19.3 C:\Users\tjc\Desktop\C練習\Untitled4.c[Error]变量大小的对象可能未初始化 19.3 C:\Users\tjc\Desktop\C練習\Untitled4.c[警告]数组初始值设定项中的元素过多 19.3 C:\Users\tjc\Desktop\C練習\Untitled4.c[警告](接近“A”的初始化) #包括 #包括 #包括 int cmpW(常数无效*p1,常数无效*p2){ 浮动*pf1=(浮动*)p1; 浮动*pf2=(浮动*)p2;

19.3 C:\Users\tjc\Desktop\C練習\Untitled4.c[Error]变量大小的对象可能未初始化

19.3 C:\Users\tjc\Desktop\C練習\Untitled4.c[警告]数组初始值设定项中的元素过多

19.3 C:\Users\tjc\Desktop\C練習\Untitled4.c[警告](接近“A”的初始化)

#包括
#包括
#包括
int cmpW(常数无效*p1,常数无效*p2){
浮动*pf1=(浮动*)p1;
浮动*pf2=(浮动*)p2;
返回pf1[0]-pf2[0];
}
内部cmpH(常数无效*p1,常数无效*p2){
浮动*pf1=(浮动*)p1;
浮动*pf2=(浮动*)p2;
返回pf2[1]-pf1[1];
}
内部主(空)
{
常数大小n=5;
浮点A[n][2]={0};//第19行
int i=0;

对于(i=0;i这是C和C++如何处理符合<代码> const <代码> >的变量的差异。在C中,<代码> const < /C>变量不被认为是真常数,所以声明<代码>浮点[n](2)< /COD>被认为是可变长度数组,即使<代码> n<代码>被声明为<代码> const int < /C> > 根据第6.6节(常数表达式):

8算术常数表达式应具有算术类型,且只能具有整数常数的操作数, 浮动常量、枚举常量、字符常量、,
sizeof
结果为整数常量的表达式,以及
\u表达式的对齐。算术常量表达式中的强制转换运算符只能将算术类型转换为算术类型
类型,但作为
sizeof
\u操作员的校准

由于
A
被视为可变长度数组,因此它可能不会被初始化

根据第6.7.9节(初始化):

3待初始化实体的类型应为大小未知的数组或不属于 可变长度数组类型。


我认为,这是编译器的特殊错误,而不是常量变量错误。如果您这样更改代码,同样的错误仍然存在

size_t n = 5;
float A[n][2] = {0}; 


如果您在DevC++中从工具->编译器选项->程序中为C设置g++.exe编译器,问题将得到解决。但是,这并不安全。我想解释问题的原因。

请在问题中添加确切的错误消息谢谢提醒,已经更新,请查看!@linglinglingling--No。您可以声明变量长度数组,但您不能初始化它们。这里术语initialize在C中的意思是特定的。您可以使用,例如,
int-arr[5]={1,2,3,4,5};
,初始化固定大小的数组。但是您不能使用VLAs;相反,您必须以另一种方式赋值。例如,通过循环:
size\t sz=5;int-arr[sz];例如(size_t i=0;i
。有时我们会草率地称之为初始化,但在C语言中,这不是技术上的初始化,只是赋值。你应该找一本好的C语言书来阅读这方面的内容。C语言是一种危险的语言,通过猜测来编写代码。谢谢David,你对VLA的理解是正确的,因为我在C prime plus中读到了它~正如你在上面提到的步骤,它有gcc。exe、g++.exe、mingw32-make.exe、gdb.exe和gprof.exe,看起来我不需要更改任何东西~那么我现在能做什么呢?这是错误的;错误不是特定于编译器的,而是特定于语言的。错误是因为可变长度数组不能用C初始化。大卫,请你详细说明特定于语言的内容好吗?@LingLingLing--lC++语言是一种特性,任何符合C语言的编译器都会产生这个错误。C++是一种不同的语言,G++是C++编译器。所以它是语言,而不是编译器。意思是数组必须在C,EXA(3)[2 ]中声明。在所有情况下,这也适用于所有的情况吗?
size_t n = 5;
float A[n][2] = {0}; 
int n = 5;
float A[n][2] = {0};