整数の配列を深くコピーする関数を書く必要があります。 ポインタ演算のみを使用します(つまり、orig [i]のような配列要素の構文は使用できません) )。ポインタ演算のみを使用して整数配列のディープコピー
最初の引数はコピーする配列で、その長さは2番目の引数で指定します。
int* copyArray(const int *orig, int size) {
int *copy = malloc(size * sizeof *copy);
int **toReturn = ©
for (int i = 0; i < size; i++, orig++, copy++) {
*copy = *orig;
}
return *toReturn;
}
int main() {
int testArray[3] = {1, 2, 3};
int *testptr = testArray;
int *copied = copyArray(testptr, 3);
for (int i = 0; i < 3; i++) {
printf("%d %p", testArray[i], &testArray[i]);
printf("\n");
}
printf("\n");
for (int i = 0; i < 3; i++) {
printf("%d %p", copied[i], &copied[i]);
printf("\n");
}
return 0;
}
これは私の右の結果を取得していない...私はこのことから得る 結果は次のとおりです:
1 0x7ffce0ff6fd0
2 0x7ffce0ff6fd4
3 0x7ffce0ff6fd8
0 0xe1301c
0 0xe13020
0 0xe13024
それが必要のに対し、ここで
は、私がこれまでにしたものですbe:
1 0x7ffce0ff6fd0
2 0x7ffce0ff6fd4
3 0x7ffce0ff6fd8
1 0xe1301c
2 0xe13020
3 0xe13024
私はポインタとメモリの割り当てに新しいです... 私は間違って何をしていますか?
更新日:問題が解決しました。
私の答え、または他の回答も見てください。文体
int *copyArray(const int *orig, size_t size)
{
int *copy = malloc(size * sizeof(*copy));
for (size_t ii = 0; ii < size; ii++)
{
copy[ ii ] = orig[ ii ];
}
return(copy);
}
のようなものに
あなたは 'copy'をインクリメントしているので、ときにそれを返す、それが配列の最後を指します。また、3バイトのメモリしか割り当てていません。 'malloc(size * size * copy)'でなければなりません。 3番目の問題が見つかりました: 'size'を' 3'ではなく 'copyArray()'のforループで使用してください。 – potrzebie
ありがとう@potrzebie!私はあなたが推奨する変更を加えました...しかし、私はまだ同じ結果を得ています。私はリターンステートメントに適切な変更を加えたかどうかはわかりません。見てください!更新しました。 – RockAndaHardPlace
@RockAndaHardPlace 'copy ++'行は使用できません。それはあなたが返す価値を変えます。 'malloc'から取得した' copy'の値はあなたの 'copyArray'関数から*変更されず*返されなければなりません。 –