我现在正在学习一些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
printf
's%d
代表十进制整数,而不是double。
所以这一行:
printf("Field%i: %d\n",i, field[i]);
应该:
printf("Field%i: %f\n",i, field[i]);
使用错误的格式说明符是您之前的未定义行为。
从标准
如果任何参数不是相应转换规范的正确类型,则行为未定义。
还要检查 的返回值malloc
。它让您知道分配是否失败(返回NULL
)。
David C. Rankin 评论中的更多见解
该
%d
格式说明正在寻找4
-bytes(sizeof int
在内存中的字节)顺序根据你的机器的字节序。当您提供一个sizeof double
由符号位、标准化指数和尾数组成的 8 字节 ( ) 值时,它不知道如何处理它。
那么在这里printf
我们可以使用%f
而不是%lf
也,这增加了与 C99 之前版本兼容的好处,而且它更短。(chux 指出了这一点)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句