0

このコードは 2 つのファイルとやり取りしていますが、これら 2 つの関数でセグメンテーション エラーが発生しており、その理由を突き止める手助けが必要です。の関数に をfileA.c渡します。 で int 配列を作成し、それをポイントして で出力できるようにするため、は出力パラメーターとして機能します。では、配列を作成し、その配列へのポインターを設定します。int**fileB.cint**fileBfoofileAfileB.c

size と foo は、メイン ファイルの別の関数で初期化されます。それはうまくコンパイルされますが、出力は (if size == 10) になります:

0 1 2 3 4 5 6 7 8 9

セグメンテーション違反

fileA.c

void testPointing(int size, int** foo) {
    initialize(size, foo);
    int i;
    for(i = 0; i < size; i++) {
        printf("%d ", (*foo)[i]);
    }
}

fileB.c:

void initialize(int size, int** foo) {
    int* a;
    a = (int*)malloc(size * sizeof(int);
    int i;
    for(int i = 0; i < size; i++) {
        printf("%d ", a[i]);
    }
    printf("\n\n");
    foo = &a;
}

セグメンテーション エラーが発生する理由を修正し、理解するための支援が必要です。fileA.c代わりに後 foo = &a にあるループを配置することを選択するとfileB.c、コンパイルされて正しい出力が表示されます。

4

1 に答える 1

5

によって返されるアドレスはデータを保持するものであり、それはではなくmalloc()に格納されます。ローカル変数のアドレスです。a&a&aa

また、fooは単なるローカル関数の引数でinitialize()あり、呼び出し元に渡された引数ではありません。それは*foo。これにより、呼び出し元がfoo未設定のままになるため、セグメンテーション違反が発生します。

したがって、代わりに:

foo = &a;

必要なもの:

*foo = a;

への最初の呼び出しは次のtestPointing()ようになります。

int* array;
testPointing(size, &array);
于 2012-11-26T07:54:00.067 に答える