【问题标题】:Initialize a double array with int values in C在 C 中用 int 值初始化一个双精度数组
【发布时间】:2017-12-30 10:37:43
【问题描述】:

我现在正在学习一些 c,并且必须为大学做一个练习。我需要一个应该用 int 值填充的双精度数组。所以我有这个。

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char *argv[] ) {

int size=0, i=0;

printf("Enter size of array: ");
scanf("%d", &size);

double* field = malloc(size * sizeof(double));
double value;

for(i=0; i<size; i++) {
    field[i] = i;;
}

for(i=0; i<size; i++) {
    printf("Field%i: %d\n",i, field[i]);
}

free(field);

return 0;

}

但是,当我执行它时,所有值都设置为 0。

Enter size of array: 10
Field0: 0
Field1: 0
Field2: 0
Field3: 0
Field4: 0
Field5: 0
Field6: 0
Field7: 0
Field8: 0
Field9: 0

【问题讨论】:

  • 请参阅this Q&A 以获得解释。
  • 检查编译器的警告选项。许多编译器可以针对格式说明符不匹配发出警告 - 不要忽略警告 - 特别是不要询问有关发出警告的代码的问题 - 要么专门询问警告,要么在询问之前修复警告。

标签: c arrays


【解决方案1】:

printf%d 代表十进制整数,而不是双精度

所以这一行:

printf("Field%i: %d\n",i, field[i]);

应该是:

printf("Field%i: %f\n",i, field[i]);

使用错误的格式说明符是您之前使用的 undefined behavior

来自standard

如果任何参数不是对应的正确类型 转换规范,行为未定义。


还要检查malloc 的返回值。它让你知道分配是否失败(返回NULL)。

从 David C. Rankin 的评论中获得更多见解

%d 格式 说明符在内存中寻找4-bytes (sizeof int bytes) 根据您机器的字节序排序。当您提供 由符号位组成的 8 字节 (sizeof double) 值,标准化 指数和尾数,它不知道如何处理它。

printf 中,我们可以使用%f 代替%lf,这也增加了与C99 之前版本兼容的好处,而且它更短。 (chux 指出了这一点)。

【讨论】:

  • The ole',我正在尝试将 IEEE-754 双精度浮点值打印为int,但它不起作用??
  • 请理解,%d 格式说明符 正在根据您机器的字节序在内存中查找 4 字节。当您提供一个由符号位、标准化指数和尾数组成的 8 字节值时,它不知道如何处理它。
  • 当然,您有免费许可证。随意使用。
  • @DavidC.Rankin.:好吧,我猜 OP 的机器是 Little Endian,这就是为什么它打印(这不是标准行为)它的 4 个字节,即 0's。 (所有这些数字的尾数都是 0)。 8.0 的十六进制表示为 0x4020000000000000
  • @DavidC.Rankin.:说它不是未定义的行为比说它不是标准行为更正确。它可能已经崩溃了。
【解决方案2】:

我不认为 malloc 函数是否为数组分配了内存。检查 malloc 的语法以及返回类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    相关资源
    最近更新 更多