试图读取浮法成阵列时scanf的崩溃(scanf crashes when trying to re

2019-09-29 01:07发布

这是我的代码:

double values[8], cumulative[8];

printf("Enter first decimal number: ");
scanf("%f", values[0]);
printf("values[0] = %g", values[0]);

我的问题是,scanf函数语句导致程序崩溃,并且永远不会执行第二个printf。 我最初的尝试是填补阵列的每个插槽具有双重,但因为没有工作我简化了程序,这一点,但是这也不管用。

我是一个初学者学习C ++的,所以我可能犯了一个愚蠢的错误,我只是不明白。 任何帮助,将不胜感激,谢谢!

编辑:

好了,所以显然我需要一个符号添加到scanf函数声明。 但我认为一个数组只是一个指向数组的第一个元素? 我为什么要使用符号?

Answer 1:

scanf("%f", values[0]); - 在这里,第一个元素的地址应传递给scanf函数。 你逝去的是一个垃圾值,以便它坠毁第一要素的价值。

values[0]*(values + 0)所以这会给第一个元素不是第一元素的地址的值。

scanf("%lf", &values[0]);scanf("%lf", (values + 0));scanf("%lf", values);

因为它是double用途%lf代替%f

在你的程序还有一个问题是uninitlized变量。 尝试将变量初始化为零,同时宣布。

double values[8] = {0};
double cumulative[8] = {0};

在有些地方你的代码的Acessing一些错误的指针会导致100%的崩溃,如果其initiliazed为零。 否则,它会尝试访问一些垃圾值指针,这将导致内存损坏,这有时会不会崩溃反而会给意想不到的输出。 但是,这也有越来越崩溃的几率为50%,你现在得到。



Answer 2:

scanf("%f", values[0]);

你需要通过一个位置的地址存储到scanf() 。 它需要:

scanf("%f", &values[0]);

否则,你只是告诉scanf()输入值到任何存储位置指向通过的初始值的整数表示存储values[0] -你想要的是绝对不是。



Answer 3:

用于扫描的格式double%lf ; %ffloat 。 这是从不同printf()其迷惑人-太我。 您还需要一个指针传递给变量。

如果你使用GCC,它应该是警告你的格式不匹配。 如果没有,你没有启用足够的警告选项编译( -Wall是一个很好的起点;添加-Wextra-Werror如果可以的话)。 对检查明确选项printf()scanf()格式是-Wformat ,但它包含在-Wall

#include <stdio.h>

int main(void)
{
    double values[8];

    printf("Enter first decimal number: ");
    if (scanf("%lf", &values[0]) != 1)
        printf("Scan failed!\n");
    else 
        printf("values[0] = %g\n", values[0]);
    return(0);
}

请注意,这包括在输出的端部的换行,并且也当诊断有一个问题(例如没有数据,或无效的数据)上的输入端。

我想到了一个数组只是一个指向数组的第一个元素? 我为什么要使用符号?

  1. 阵列不只是一个指向数组的第一个元素,但是,当一个数组名称在其他表达式中被使用不是作为一个参数sizeof()它改变为指针数组的第一个元素。
  2. 你必须使用与号因为values[0]是阵列的第一个元素,该阵列的第一个元素的不地址,和的值scanf()需要的地址,而不是值。 记住: a[i] == *(a + i)用于阵列名称或指针a和索引i ,并注意*取消引用指针。 如果你写scanf("%lf", values)scanf("%lf", values + 0)要传递一个指针。 需要注意的是传球scanf("%lf", &values)将是一个类型不匹配(虽然作为地址传递的值是相同的-所以它巧合“作品”)。 通过型式是“指针至8中的阵列double ”,这是不一样的“指针double ”。


文章来源: scanf crashes when trying to read a float into an array
标签: c crash scanf