1

这是我的代码:

double values[8], cumulative[8];

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

我的问题是 scanf 语句使程序崩溃,第二个 printf 永远不会执行。我最初的尝试是用双精度填充数组的每个插槽,但由于这不起作用,我将程序简化为这个,但这也不起作用。

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

编辑:

好的,显然我需要在 scanf 语句中添加一个 & 符号。但我认为数组只是指向数组第一个元素的指针?为什么我必须使用 & 符号?

4

3 回答 3

1

scanf("%f", values[0]);- 这里第一个元素的地址应该传递给scanf。您正在传递第一个元素的值,这是一个垃圾值,因此它崩溃了。

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

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

因为它是double使用%lf而不是%f.

程序中的另一个问题是未初始化的变量。尝试在声明时将变量初始化为零。

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

如果在代码的某个位置访问一些错误的指针,如果它初始化为零,将导致 100% 崩溃。否则它将尝试访问一些会导致内存损坏的垃圾值指针,这有时不会崩溃,而是会给出意外的输出。但这也有 50% 的几率发生崩溃,而您现在正在遇到这种情况。

于 2013-02-02T20:36:31.803 回答
0
scanf("%f", values[0]);

您需要将要存储的位置的地址scanf()传递给. 它需要是:

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

否则,您只是告诉scanf()将输入值存储到初始化值的整数表示所指向的任何内存位置values[0]——这绝对不是您想要的。

于 2013-02-02T20:37:40.053 回答
0

扫描 a 的格式double%lf; %f是为float。这与让人们感到困惑的 不同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)or scanf("%lf", values + 0),你正在传递一个指针。请注意,传递scanf("%lf", &values)将是类型不匹配(尽管作为地址传递的值是相同的——所以它巧合地“有效”)。传递的类型将是“指向 8 数组的指针double”,这与“指向 8 的指针double”不同。
于 2013-02-02T20:38:03.950 回答