我使用malloc创建了一个动态矢量,如果我使用整数创建它没有问题,但是一旦我在代码中使用double就得到了错误的答案,而不是打印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;
}
答案 0 :(得分:4)
您的代码存在两个问题
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(" %f\n", dd[0]);
printf(" %f\n", dd[1]);
man 3 printf
转换说明符
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 memory\n");
return 1;
}
dd[0] = 35;
dd[1] = 88.5;
printf(" %f\n", dd[0]);
printf(" %f\n", dd[1]);
free(dd);
return 0;
}
答案 1 :(得分:0)
您正在使用错误的格式说明符进行打印。
%d
的{{1}}格式说明符需要printf
,但您需要传递int
。使用错误的格式说明符会调用undefined behavior,在这种情况下会显示为打印错误的值。
要打印double
,您需要double
:
%f
另外,您没有为阵列分配正确的大小。您需要2 printf(" %f ",dd[0]);
printf(" %f ",dd[1]);
的空间,但为2 double
分配空间。因此,更改表达式以获得double *
:
double