半动态分配代码在c ++中工作,但不在c中,为什么?

时间:2017-03-26 14:57:17

标签: c

以下两个代码在c ++文件中工作正常,但在c中编译错误,为什么?  它似乎使用const变量导致c中的一些问题, 我使用dev c ++ 5.11

  

19 3 C:\ Users \ tjc \ Desktop \ c练习\ Untitled4.c [错误]可能无法初始化可变大小的对象

     

19 3 C:\ Users \ tjc \ Desktop \ c练习\ Untitled4.c [警告]数组初始值设定项中的多余元素

     

19 3 C:\ Users \ tjc \ Desktop \ c练习\ Untitled4.c [警告](接近初始化' A')

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int cmpW( const void* p1, const void*p2){
     float *pf1 = (float*)p1;
     float *pf2 = (float*)p2;
     return pf1[0] - pf2[0];
}
int cmpH( const void* p1, const void*p2){
     float *pf1 = (float*)p1;
     float *pf2 = (float*)p2;
     return pf2[1] - pf1[1];
}

int main(void)
{
     const size_t n = 5;
     float A[n][2] = {0}; //line 19
     int i=0;
     for(i=0; i<n; ++i){ // Data input.
     printf("W H: ");
     scanf("%f %f", &A[i][0], &A[i][1]);
     }
     qsort(A, n, sizeof(float) * 2, cmpW ); // By weight
     for(i=0; i<n; ++i) // Data input.
     printf("(%f, %f) ", A[i][0], A[i][1]);
     printf("\n");
     qsort(A, n, sizeof(float) * 2, cmpH ); // By height
     for(i=0; i<n; ++i) // Data input.
     printf("(%f, %f) ", A[i][0], A[i][1]);
     printf("\n");

    system("pause");
}

2 个答案:

答案 0 :(得分:4)

这与C和C ++如何处理限定为const的变量有所不同。在C中,const变量不被视为真常量,因此声明float A[n][2]被视为可变长度数组,即使n被声明为const int

来自C standard

的第6.6节(常量表达式)
  

8 算术常量表达式应具有算术类型,并且只能具有整数常量的操作数,   浮点常量,枚举常量,字符常量,   sizeof表达式,其结果是整数常量,和   _Alignof个表达式。算术常量表达式中的转换运算符只能将算术类型转换为算术类型   类型,除了作为sizeof或的操作数的一部分   _Alignof运营商。

由于A被视为可变长度数组,因此可能无法初始化。

从第6.7.9节(初始化):

  

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

答案 1 :(得分:0)

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

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

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

如果你从工具 - >编译器选项 - &gt;程序在DevC ++中为C设置g ++。exe编译器,问题就会解决。但是,这不安全。我想解释问题的原因。