【问题标题】:Unable to print the array values in C无法在 C 中打印数组值
【发布时间】:2018-04-09 01:10:53
【问题描述】:

这只是一个简单的 C 程序来显示从用户那里获取的数组元素,但是我想知道为什么在尝试打印数组时会得到垃圾值...如果有人可以提供帮助,我将不胜感激...谢谢!

#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;
}

【问题讨论】:

  • 看起来您只要求用户提供一个双倍,而不是 N。
  • 另外,如果doubles 是一个双精度数组,则scanf("%f",&amp;doubles[dcount]); 是错误的;你想要%lf。 (我自己没有注意到这一点,但我的编译器注意到了,并警告了它——我想知道你的为什么没有?)
  • 你只收到了一个双打[0]。并使用 %lf 而不是 %f 作为双精度数。
  • 已经有答案的请不要更新代码!如果您删除答案正在评论的代码,则答案没有意义。

标签: c arrays dynamic double


【解决方案1】:

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

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

您需要为所有索引调用enterDouble

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

enterDouble 中的 dcount++; 对我来说毫无意义,调用者知道它传递了哪个索引,无需返回相同的索引 + 1。

另请参阅do not cast malloc,您并没有释放您已拥有的内存 已分配。

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

man scanf

...

l 表示转换将是d, i, o, u, x, Xn 之一,并且下一个指针是指向long intunsigned long in(而不是int),或者转换将是e, fg之一,并且下一个指针是指向 double(而不是float)。

...

f 匹配可选带符号的浮点数; next 指针必须是指向float 的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2017-11-05
    相关资源
    最近更新 更多