1

これは私のコードです:

double values[8], cumulative[8];

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

私の問題は、scanfステートメントがプログラムをクラッシュさせ、2番目のprintfが実行されないことです。私の最初の試みは、配列の各スロットをdoubleで埋めることでしたが、それが機能しなかったため、プログラムをこれに簡略化しましたが、これも機能しません。

私は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

プログラムのもう1つの問題は、初期化されていない変数です。宣言中に変数をゼロに初期化してみてください。

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注意してください。または*を書いた場合は、ポインタを渡しています。渡すと型が一致しないことに注意してください(ただし、アドレスとして渡される値は同じであるため、偶然に「機能」します)。渡される型は、「8の配列へのポインター」になります。これは、「ポインターから」と同じではありません。scanf("%lf", values)scanf("%lf", values + 0)scanf("%lf", &values)doubledouble
于 2013-02-02T20:38:03.950 に答える