2016-09-28 4 views
1

Je pense que la copie éléments du tableau comme celui-ci:C: unsigned char * octets éléments de copie de tableau à d'autres non signé tableau 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++; 

}

fait une copie, mais la valeur non par référence, mais Je voudrais m'assurer que ce sera copie profonde non seulement la copie peu profonde des références ou des pointeurs. Je sais que c'est peut-être facile et ridicule qustion, mais je ne peux pas trouver sur la pile plutôt memcpy() tout tableau, mais je veux copier seulement quelques éléments par exemple tous les deux éléments, ou copier 1-3 éléments et ignore le 4ème élément, (si i% 4 == 0 ignore l'élément).

+1

Votre code fait une « copie en profondeur » comme il est. –

+1

Notez que 'sizeof (unsigned char)' est toujours 1, donc c'est juste un moyen ennuyeux d'écrire '1' (wihch dans le cas d'une multiplication est plutôt inutile). Envisagez de l'enlever. – unwind

+0

@unwind réellement sur une plate-forme différente, 'sizeof (unsigned char)' n'est pas toujours 1. Donc, je pense que ce n'est pas une bonne idée de le supprimer. – litao3rd

Répondre

2

new_bytes_array[j] évalue à unsigned char.

En supposant old_bytes_array[i] fait aussi bien, alors ce

new_bytes_array[j] = old_bytes_array[i]; 

copies d'un unsigned char et non un pointeur, pas unsigned char*.

0

Oui, l'affectation que vous affiche attribue un seul unsigned char, c'est-à-dire "un octet" sur la plupart des ordinateurs types, mais ne copie pas les pointeurs mais les données brutes.

est ici une fonction complète qui fait ce que vous voulez, et corrige quelques problèmes mineurs:

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