0
void load(int *n, int *x, int **arr)
{   
    arr = (int**)malloc(sizeof(int*)*(*n));
    for(int i = *n; i >= 0; i--)
    {
        scanf("%d", &arr[i]);
    }
}

int main()
{
    int n = 0, x = 0;
    int *arr;

    load(&n, &x, &arr);

    printf("%d", arr[1]);

    return EXIT_SUCCESS;
}

プログラムは正しくコンパイルされますがprintf()、メイン関数の実行中に Windows エラーがスローされます。「arr」だけを表示すると、ランダムな大きな数値が得られます。ここで何が問題なのですか?

4

2 に答える 2

1
arr = (int**)malloc(sizeof(int*)*(*n));

main は何も変更せず、受け取るポインタ ( arrinのアドレスmain)のコピーを上書きするだけです。load

関数がすべきことは、 を変更arrするmainことです。そのためには、引数を逆参照する必要があります。

*arr = (int*)malloc(sizeof(int)*(*n)); // cast for C++ compiler left in

arrinの値を変更しますmain。( の引数arrload指すオブジェクト、つまり は変更arrするmain必要があるため、 で変更する必要があります*arrload)

その後、スキャンは次のようになります。

scanf("%d", &(*arr)[i]);

または(同等)

scanf("%d", *arr + i);
于 2013-04-06T13:48:31.480 に答える
-1
#include <stdio.h>
#include <stdlib.h>
void load(int *n, int *x, int **arr)
{   
    int i = 0;
    *arr = (int*) malloc(*n * sizeof(int));
    if(!*arr) {
        perror("Can not allocate memory!");
        return;
    }
    for(i = *n; i >= 0; i--)
    {
        scanf("%d", *arr + i);
    }
    return;
}

int main()
{
    int n = 0, x = 0;
    int *arr;
    int i;

    /* You probably need to initialize n */
    n = 5;
    load(&n, &x, &arr);

    for(i = n; i >= 0; i--)
    {
        printf("%d - %d\n", i, arr[i]);
    }
    return EXIT_SUCCESS;
}
于 2013-04-06T14:03:58.347 に答える