这是我的代码:
double values[8], cumulative[8];
printf("Enter first decimal number: ");
scanf("%f", values[0]);
printf("values[0] = %g", values[0]);
我的问题是,scanf函数语句导致程序崩溃,并且永远不会执行第二个printf。 我最初的尝试是填补阵列的每个插槽具有双重,但因为没有工作我简化了程序,这一点,但是这也不管用。
我是一个初学者学习C ++的,所以我可能犯了一个愚蠢的错误,我只是不明白。 任何帮助,将不胜感激,谢谢!
编辑:
好了,所以显然我需要一个符号添加到scanf函数声明。 但我认为一个数组只是一个指向数组的第一个元素? 我为什么要使用符号?
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%,你现在得到。
scanf("%f", values[0]);
你需要通过一个位置的地址存储到scanf()
。 它需要:
scanf("%f", &values[0]);
否则,你只是告诉scanf()
输入值到任何存储位置指向通过的初始值的整数表示存储values[0]
-你想要的是绝对不是。
用于扫描的格式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);
}
请注意,这包括在输出的端部的换行,并且也当诊断有一个问题(例如没有数据,或无效的数据)上的输入端。
我想到了一个数组只是一个指向数组的第一个元素? 我为什么要使用符号?
- 阵列不只是一个指向数组的第一个元素,但是,当一个数组名称在其他表达式中被使用不是作为一个参数
sizeof()
它改变为指针数组的第一个元素。 - 你必须使用与号因为
values[0]
是阵列的第一个元素,该阵列的第一个元素的不地址,和的值scanf()
需要的地址,而不是值。 记住: a[i] == *(a + i)
用于阵列名称或指针a
和索引i
,并注意*
取消引用指针。 如果你写scanf("%lf", values)
或scanf("%lf", values + 0)
要传递一个指针。 需要注意的是传球scanf("%lf", &values)
将是一个类型不匹配(虽然作为地址传递的值是相同的-所以它巧合“作品”)。 通过型式是“指针至8中的阵列double
”,这是不一样的“指针double
”。