它只是一个简单的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;
}
答案 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, X
或n
之一,而下一个指针是指向long int
的指针要么unsigned long in
(而不是int
),或转换将是e, f
之一,或g
和,下一个指针是指针double
(而不是float
)。...
f
匹配可选的已签名浮点数;下一个指针必须是指向float
的指针。