2016-10-09 11 views
1

整数の配列を深くコピーする関数を書く必要があります。 ポインタ演算のみを使用します(つまり、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); 
} 

のようなものに

+2

あなたは 'copy'をインクリメントしているので、ときにそれを返す、それが配列の最後を指します。また、3バイトのメモリしか割り当てていません。 'malloc(size * size * copy)'でなければなりません。 3番目の問題が見つかりました: 'size'を' 3'ではなく 'copyArray()'のforループで使用してください。 – potrzebie

+0

ありがとう@potrzebie!私はあなたが推奨する変更を加えました...しかし、私はまだ同じ結果を得ています。私はリターンステートメントに適切な変更を加えたかどうかはわかりません。見てください!更新しました。 – RockAndaHardPlace

+1

@RockAndaHardPlace 'copy ++'行は使用できません。それはあなたが返す価値を変えます。 'malloc'から取得した' copy'の値はあなたの 'copyArray'関数から*変更されず*返されなければなりません。 –

答えて

2

変更copyArray、私は個人的にiiの代わりi好きです。 iを検索するのは難しいです。そして、何かの大きさを記述するために、size_tintよりも良い選択です。

エラーチェックを追加する必要があります。malloc返信NULL

そして、ポインタのインデックスを作成せずに(簡単なコードを禁止することがあるので?!?)

int *copyArray(const int *orig, size_t size) 
{ 
    int *copy = malloc(size * sizeof(*copy)); 

    memcpy(copy, orig, size * sizeof(*copy)); 
    return(copy); 
} 

とにかく可能性が高速ですこと。適切なヘッダーのインクルードは、読者のために大量に残されています... ;-)

それでもエラーチェックが必要です。

+0

ありがとう!おそらくこれはうまくいくでしょうが、私が質問したように、コピー[ii]のような配列要素構文を使うことは許されません。 – RockAndaHardPlace

+1

@RockAndaHardPlace *私は質問の中で述べたように、コピー[ii]のような配列要素構文を使うことは許されません。途中で簡単な修正.... –

+0

もう一度、ありがとう@ AndrewHenie! – RockAndaHardPlace

1

これはcopyArray機能の作業バージョンです:

int* copyArray(const int *orig, int size) { 

    int *copy = malloc(size * sizeof *copy); 

    int *toReturn = copy; 

    for (int i = 0; i < size; i++, orig++, copy++) { 
    *copy = *orig; 
    } 

    return toReturn; 

} 
関連する問題