这只是一个简单的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;
}

最佳答案

因为您只调用一次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读取double的正确转换说明符是%lf,而不是%f


  男人scanf
  
  ...
  
  l表示转换将是d, i, o, u, x, Xn之一,而下一个指针是指向long int
  unsigned long in(而不是int),或者转换将是e, fg之一,而下一个指针是指向
  double(而不是float)。
  
  ...
  
  f匹配一个可选的带符号浮点数;下一个指针必须是指向float的指针。

09-04 09:08