0

このコードでは、ユーザーにint値(x)を入力させてから、以下のwhileループでこの値を比較させようとしています:while(k <x)。これを行うと、プログラムがクラッシュします。

int main()
{
    long int sum = 0;
    long int i = 1;
    long int j = 2;
    long int k = 0;
    int x = 0;
    printf("This program will sum up all of the evenly valued terms from the 
    Fibionacci sequence, up until the\n user-specified highest term value.\n");
    printf("Set this limit: "); 
    scanf("%d",x);

while(k < x)
{   
    k = i + j;
    if(k%2==0)
        sum +=k;
    i = j;
    j = k;

}

printf("The sum of all of the evenly valued terms of the Fibionacci sequence up     until the value %d is %d",x,sum);
return 0;
}
4

2 に答える 2

5

次の行が原因でプログラムがクラッシュします。

scanf("%d",x);

Cは、参照ではなくで引数を渡します。したがって、C関数が呼び出し元からの変数を変更できるようにするには、関数はポインターを予期し、呼び出し元は変数のアドレスを渡す必要があります。

scanf("%d", &x);

アドレスの受け渡しを怠るとscanf、メモリ内の任意の場所(この場合はアドレス0)に書き込もうとします。これにより、未定義の動作が発生します。

comp.lang.cFAQのQ12.12も参照してください。

于 2013-03-17T04:55:34.123 に答える
3

ここにアドレスが必要です:

scanf("%d",x); // ==> scanf("%d", &x);

そうしないと、奇妙なことが起こる可能性があります。Cでは、関数パラメーターで結果を受け取ることを期待している場合は、アドレスを渡します。

于 2013-03-17T04:53:34.380 に答える