这只是一个简单的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, X
或n
之一,而下一个指针是指向long int
或unsigned long in
(而不是int
),或者转换将是e, f
或g
之一,而下一个指针是指向double
(而不是float
)。...
f
匹配一个可选的带符号浮点数;下一个指针必须是指向float
的指针。