私は 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
でc変数を参照で渡すことはできません。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);
あなたが望んでいることを実行します。