Malloc和双重问题

时间:2018-04-10 17:37:16

标签: c double malloc

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

2 个答案:

答案 0 :(得分:4)

您的代码存在两个问题

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(" %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