2016-09-28 85 views
1

我认为复制这样数组的元素:C:无符号字符*字节数组复制元素到其他无符号字符*阵列

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,但我找不到类似于stack而memcpy()的所有数组,但我只想复制一些元素,例如每个第二个元素,或者复制1-3个元素和跳过第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,即大多数典型计算机上的“一个字节”,它不会复制指针,而是复制原始数据。

下面是一个完整的功能,你想要什么,并修复了一些小问题:

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; 
}