无法在C中打印数组值

时间:2018-04-09 01:10:54

标签: c arrays dynamic double

它只是一个简单的C程序,用于显示从用户处获取的数组元素,但是idk为什么在尝试打印数组时获取垃圾值...如果有人可以帮助我真的很感激..谢谢!

#include <stdio.h>
#include <stdlib.h>

double *array_dou;

double* initializeDoubles(int *maxdouble)
{

printf("Enter the max. double value the program should support: ");
scanf("%d",maxdouble);
array_dou = (double *) malloc((*maxdouble)*sizeof(double));
if(array_dou == NULL)                     
{
    printf("Error! memory not allocated.");
    exit(-1);
}

return array_dou;
}

int enterDouble(double *doubles,int dcount,int maxdouble)
{
 for(dcount=0; dcount<maxdouble; dcount++)
 {
printf("Please enter a double value: ");
scanf("%f",&doubles[dcount]);
 }
return dcount;
}

int main()
{
int maxdouble;

int dcount=0;

double *doubles;

doubles = initializeDoubles(&maxdouble);

dcount = enterDouble(doubles,dcount,maxdouble);

printf("\nDouble array\n");

for(int j=0;j<dcount;j++)
{
printf("%lf  ",doubles[j]);
}
return 0;
}

1 个答案:

答案 0 :(得分:1)

因为您只调用enterDouble一次而且只读取一个值。此外,您正在访问内存超出范围。您分配了dcount个元素,因此您只能通过索引0到dcount - 1访问内存,但是您将dcount传递给enterDouble,因此您正在尝试写在索引dcount(超过限制一个)。

所有其他条目都未初始化,因此您有两个原因可以看到“垃圾”:访问内存超出界限的未定义行为以及您尚未初始化任何双打的事实。

您需要为所有索引调用enterDouble

for(int j = 0; j < dcount; ++i)
    enterDouble(doubles, j);

dcount++;中的enterDouble对我没有任何意义,调用者知道它传递了哪个索引,不需要返回相同的索引+ 1.

另见do not cast malloc并且你没有释放你的记忆 分配

使用scanf读取双打的正确转换说明符是%lf,而不是%f

  

man scanf

     

...

     

l 表示转化将是d, i, o, u, x, Xn之一,而下一个指针是指向long int的指针要么   unsigned long in(而不是int),或转换将是e, f之一,或g,下一个指针是指针   double(而不是float)。

     

...

     

f 匹配可选的已签名浮点数;下一个指针必须是指向float的指针。