C関数内の配列を変更する 質問する

C関数内の配列を変更する 質問する

私は C を学習していますが、main で作成された配列が関数内で変更されない理由がわかりません。渡された配列はポインターであると想定しており、ポインターを変更すると配列も変更されるはずですよね? この場合何が起こっているのか、誰か説明できますか?

助けてくれてありがとう。

int main(){
    int i, length = 10;
    int array[length];

    for (i = 0 ; i < length ; i++)
        array[i] = i * 10;
    printf("Before:");
    print(array, length);
    change(array, length);
    printf("After:");
    print(array, length);

    return 0;
}

// Print on console the array of int
void print(int *array,int length)
{
    int i;
    for(i = 0 ; i < length ; i++)
        printf("%d ", array[i]);
    printf("\n");
}

// Change the pointer of the array
void change(int *array,int length)
{
    int *new = (int *) malloc(length * sizeof(int));
    int i;
    for(i = 0 ; i < length ; i++)
        new[i] = 1;
    array = new;
}

次のような出力が表示されると予想しました。

Before:0 10 20 30 40 50 60 70 80 90 
After:1 1 1 1 1 1 1 1 1 1 

私が得るもの:

Before:0 10 20 30 40 50 60 70 80 90 
After:0 10 20 30 40 50 60 70 80 90 

ベストアンサー1

変数を参照で渡すことはできません。array関数内に割り当てる変数には、最初は渡されたポインタと同じアドレスが含まれますが、これはそのコピーなので、変数を変更しても渡されたポインタは変更されません。

ポインタを変更するには、次のようにポインタのアドレスを渡す必要があります。

// Change the pointer of the array
void change(int **array, int length)
{
    *array = malloc(length * sizeof(int));
    if (*array == NULL)
        return;
    for (int i = 0 ; i < length ; i++)
        (*array)[i] = 1;
}

ではmain()配列に代入することはできません。このような関数を通じて代入することは、確実に未定義の動作です。で定義された配列はmain()スタック上に割り当てられ、配列には何も代入できません。-書き込み可能左辺値したがって、 で取得したヒープメモリ位置を指すようにすることはできないのでmalloc()、次のようなポインタを渡す必要があります。

int *array;
change(&array, length);
free(array);

関数で前の配列を置き換えたい場合は、free()edmalloc()データ(NULL渡すことはfree()明確に定義されていることに注意してください)、 それで

// Change the pointer of the array
void change(int **array, int length)
{
    free(*array);

    *array = malloc(length * sizeof(int));
    if (*array == NULL)
        return;
    for (int i = 0 ; i < length ; i++)
        (*array)[i] = 1;
}

その後main()

int *array;
array = NULL;
change(&array, length);
change(&array, length);
change(&array, length);
change(&array, length);
free(array);

あなたが望んでいることを実行します。

おすすめ記事