2017-05-08 6 views
0

厳密にポインタ演算を使用して値をある配列から別の配列にコピーしようとしています。これは今私が持っているコードです:ポインタ算術を使用してCの1つの配列から別の配列に値をコピーする方法

int *p; 
    int arraySize = 20; 

    int array[arraySize];  

    for (p = array; p< array+(sizeof(array)/sizeof(int)); p++){ 
     int random = rand() % 200; 
     *p = random; 
    } 

    for (p = array; p< array+(sizeof(array)/sizeof(int)); p++){ 
     printf("%d\t%x\n", *p, p); 
    } 

    //the code above works fine 

    printf("\n"); 

    //grow the new array by one to insert value at end later 
    int array2[(arraySize+1)]; 

    int *p2; 

    for(p2 = array2; p2< array2+(sizeof(array2)/sizeof(int)); p2++){ 
     *(p2) = *(p); 
    } 

    for(p2 = array2; p2< array2+(sizeof(array2)/sizeof(int)); p2++){ 
     printf("%d\t%x\n", *p2, p2); 
    } 

しかし、コードを実行すると、出力されるコードはすべて、各メモリ位置で0になります。値はコピーされないように間違っていますか?

+1

'p'はインクリメントされません。 –

+0

あなたのコードの問題は 'p2'を変更することですが、' p'を変更することはありません。タイプミスとしてクローズする投票。 – dasblinkenlight

+0

p ++を実行すると、メモリ位置に出力としていくつかのゼロが混在した乱数が与えられます – theplaid

答えて

1

あなたの問題は、あなたが*pから*p2にコピーしている。このループである:

for(p2 = array2; p2< array2+(sizeof(array2)/sizeof(int)); p2++){ 
    *(p2) = *(p); 
} 

あなたはp2をインクリメントしますがpをインクリメントしたことがないし、あなたがarrayの先頭に戻って指すようにpをリセットすることはありません。このループの始めに、pは、arrayのちょうど終わりの位置を指しています。ループを次のように変更してください。

for(p2 = array2, p = array; p2 < array2 + (sizeof(array2)/sizeof(int)) - 1; p2++, ++p){ 
    *(p2) = *(p); 
} 
関連する問題