我不能在数组中使用double吗?

时间:2019-01-29 17:53:10

标签: c

这是什么问题? 它显示了一个错误,请帮助我我是一个初学者。 我可以在数组中使用double吗?

    #include <stdio.h>
    int main()
    {
    double a;
    scanf("%lf",&a);
    double s[a];
    double b,c=0, d;
    for(b=0;b<a;b++){
    scanf("%lf",&s[b]);
    }
    for(b=0;b<a;b++){
    c = c + s[b];
    d=b+1;
    printf("%lf\n",c/d);
    }
    return 0;
    }

4 个答案:

答案 0 :(得分:4)

如果不清楚,则数组不能为双倍长度。这是未定义的行为。

这是因为double不是整数,而是可能是整数的有理数。了解此问题的一种简单方法是采用一些浮点值,例如3.5。

什么是长度为3.5的数组?连续内存中是否有3个半个大小的插槽? 3个插槽是否足够? 4? 3.5插槽可能是无用和意外的,如果它不是分数插槽,则可能不清楚并可能是意外的,因此行为不确定。

尽管其他人提出了创建整数类型的解决方案,但是您不能创建双精度长度的数组。您可以创建一个双精度数组,即

double arr[5];

但是您不能创建像这样的双倍长度数组

int arr[3.3];

答案 1 :(得分:2)

尽管现代C支持可变长度数组,但数组的大小必须为正且为整数。

相反,您可以舍入到最接近的size_t

size_t ASIZE = ceil(fabs(a));
double s[ASIZE];

包含<math.h>可以访问ceilfabs

答案 2 :(得分:2)

使用此:

int a;
scanf("%d",&a);

剩下的代码都很好。

答案 3 :(得分:2)

您不能使用浮点类型(floatdouble)来指定数组大小或数组索引:

6.7.6.2数组声明符

约束

1除了可选的类型限定符和关键字 static 外, [ ] 限定 表达式或 * 如果它们分隔表达式(指定数组的大小),则 表达式应为整数类型。如果表达式是一个常量表达式,则应为 值大于零。元素类型不得为不完整或功能 类型。可选的类型限定符和关键字static仅应出现在 具有数组类型的函数参数的声明,然后仅在最外面 数组类型派生。

C 2011 Online Draft

6.5.2.1数组下标

约束

1其中一个表达式的类型应为“完成对象的指针 type ”,另一种则为 表达式应为整数类型,结果应为“ type ”类型。

同上。

因此ab必须是整数类型-我通常将size_t用于数组大小和索引变量:

size_t a;

printf( "Gimme the array size: " );
scanf( "%zu", &a );

double s[a];

for ( size_t b = 0; b < a; b++ )
  scanf( "%lf", &s[b] );