6

私は次のコードを持っています:

int get_int(void) {
    char input[10];
    fgets(input, 10, stdin); // Segfault here
    return atoi(input);
}

マークされている場所でセグメンテーション違反が発生します。別のプログラムに次のコードがあるので、問題が何であるかはまったくわかりません。

int main(void) {
    char card[17];
    printf("Number: ");
    fgets(card, 17, stdin);
    printf("%s\n", card_type(card));
    return 0;
}

そしてそれはうまくいきます。私はそれがatoiでセグフォールトしていないことを100%確信しています。

これは他の人によって再現可能ですか、私はGCC4.4.5を使用してLinuxamd64を使用しています。コンパイルして警告を出力しませんでした。

リクエストされたので、get_intを呼び出すコードは次のとおりです。

void get_input(int *inputs) { // Stop cluttering up my main
    printf("M spotting F: ");
    inputs[0] = get_int();
    printf("F spotting M: ");
    inputs[1] = get_int();
    printf("F spotting F: ");
    inputs[2] = get_int();
    printf("M spotting M: ");
    inputs[3] = get_int();
}

それを呼び出すコードは次のとおりです。

int main(void) {
    int *inputs[4];
    int *heights[4];
    get_input(*inputs);
    get_heights(*inputs, *heights);

    print_bars(*heights);

    printf("M4F  F4M  F4F  M4M\n");
}

したがって、コールスタックの最上位に到達しました。

4

1 に答える 1

8

入力(およびおそらく高さ)配列の宣言はint inputs[4];次のようになります。整数へのポインターの配列ではなく、整数の配列が必要です。inputs次に、パラメータとしてとだけを使用して関数を呼び出しheightsます。

現在行っているのは、整数への4つのポインターの配列を作成することです。そして、で関数を呼び出すと、*inputsその配列の最初のポインタのみが関数に渡されますget_int。このget_int関数は、整数への最初のポインターを配列として使用しようとしますが、これは目的の動作ではありません。

于 2011-02-28T01:11:29.563 に答える