c - 马洛克和双重问题



我使用 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
}

第二个问题是%dint的转换说明符,你是 传递双打,这会产生未定义的行为。你必须使用%f

printf(" %fn", dd[0]);
printf(" %fn", dd[1]);

男人 3 打印f

转换说明符

diint参数转换为有符号十进制表示法。 精度(如果有)给出了必须的最小位数 出现;如果转换后的值需要较少的数字,则会在左侧填充零。 默认精度为 1。 当 0 以显式精度 0 打印,输出为空。

fFdouble参数在样式[-]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));

最新更新