我使用 malloc 创建了一个动态向量,如果我使用整数创建它没有问题,但是一旦我在代码中使用双精度,我得到了错误的答案,而不是打印 35 和 88.5 我得到了 0 和 0,有人知道为什么吗?
#include <stdio.h>
#include <stdlib.h>
int main()
{
double * dd;
dd = malloc(2*sizeof(double*));
dd[0] = 35;
dd[1] = 88.5;
printf(" %d ",dd[0]);
printf(" %d ",dd[1]);
return 0;
}
你的代码有两个问题
dd = malloc(2*sizeof(double*));
这是为 2 个double
指针分配空间,您应该使用sizeof(double)
甚至最好这样做:
dd = malloc(2 * sizeof *dd);
if(dd == NULL)
{
// error handling
// do not continue
}
第二个问题是%d
是int
的转换说明符,你是 传递双打,这会产生未定义的行为。你必须使用%f
printf(" %fn", dd[0]);
printf(" %fn", dd[1]);
男人 3 打印f
转换说明符
d,i:
int
参数转换为有符号十进制表示法。 精度(如果有)给出了必须的最小位数 出现;如果转换后的值需要较少的数字,则会在左侧填充零。 默认精度为 1。 当 0 以显式精度 0 打印,输出为空。。
f,F:
double
参数在样式[-]ddd.ddd
中舍入并转换为十进制表示法,其中 小数点字符等于精度规范。 如果缺少精度,则取为 6; 如果精度明确为零,则不显示小数点字符。 如果出现小数点,则其前至少显示一位数字。
并且不要忘记释放内存
free(dd);
所以你的程序应该看起来像这样:
#include <stdio.h>
#include <stdlib.h>
int main()
{
double * dd;
dd = malloc(2 * sizeof *dd);
if(dd == NULL)
{
fprintf(stderr, "Not enough memoryn");
return 1;
}
dd[0] = 35;
dd[1] = 88.5;
printf(" %fn", dd[0]);
printf(" %fn", dd[1]);
free(dd);
return 0;
}
您使用了错误的格式说明符进行打印。
printf
的%d
格式说明符需要int
,但您传递的是double
。 使用错误的格式说明符会调用未定义的行为,在这种情况下,这表现为打印错误的值。
要打印double
,您需要%f
:
printf(" %f ",dd[0]);
printf(" %f ",dd[1]);
此外,您没有为阵列分配正确的大小。 您需要 2 个double
的空间,但您可以为 2 个double *
分配空间。 因此,更改表达式以获取double
的大小:
dd = malloc(2*sizeof(double));