2016-09-28 7 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이지만, memcpy()의 모든 배열과 비슷한 스택을 찾을 수는 없다는 것을 알고 있지만, 예를 들어 모든 두 번째 요소 만 복사하거나 1-3 개의 요소를 복사하려고합니다. 네 번째 요소를 건너 뜁니다 (i % 4 == 0이면 요소 무시).

+1

귀하의 코드는 다음과 같이 "깊은 복사"를합니다. –

+1

'sizeof (unsigned char)'는 항상 1이므로 '1'을 쓰는 것은 성가신 방법입니다 (곱셈의 경우 wihch는 무의미합니다). 제거를 고려하십시오. – 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; 
}