2016-09-28 12 views
1

私はこのような配列の要素をコピーすることを考える:C:はunsigned char *は他のunsigned char型に配列複写要素バイト・アレイ

unsigned char *new_bytes_array = malloc(sizeof(unsigned char)*length/2); 
for(int i=0, j=0; i<length; i++) { 
    if(i % 2 == 0) continue; 
    new_bytes_array[j] = old_bytes_array[i]; 
    j++; 

}

はない参照によりコピーが、値を作成しているが、私は参照やポインタの浅いコピーではなく、これがディープコピーであることを確認したいと思います。

私はこれが多分簡単で馬鹿なqustionだと知っていますが、スタック上ではmemcpy()のすべての配列と似たものは見つけられませんが、例えば2番目ごとにいくつかの要素だけをコピーしたい、 4番目の要素をスキップします(i%4 == 0スキップ要素の場合)。

+1

あなたのコードは、「ディープコピー」を作ります。 –

+1

'sizeof(unsigned char)'は常に1であるので、 '1 'と書くのは面倒です。(乗算の場合は無意味です)。削除することを検討してください。 – unwind

+0

実際には別のプラットフォーム上で@unwind、 'sizeof(unsigned char)'は必ずしも1ではありませんので、それを削除するのは良い考えではないと思います。 – litao3rd

答えて

2

new_bytes_array[j]は、unsigned charと評価されます。

old_bytes_array[i]と仮定するとしても、この

new_bytes_array[j] = old_bytes_array[i]; 

コピーunsigned charなく、ポインタではなく、unsigned char*

0

はい、表示される割り当てによって、単一のunsigned charが割り当てられます。つまり、最も一般的なコンピュータでは「1バイト」です。ポインタはコピーされず、データはコピーされません。ここで

は何をしたいん完全な機能だ、といくつかのマイナーな問題が修正されています。あるとして

void * copy_every_second_byte(const void *src, size_t length) 
{ 
    if(src == NULL || length == 0) 
    return NULL; 
    unsigned char *out = malloc(length/2); 
    for(size_t i = 0, j = 0; i < length; ++i) 
    { 
    if(i % 2 == 0) continue; 
    out[j++] = ((unsigned char *) src)[i]; 
    } 
    return out; 
} 
関連する問題