Ce site a besoin d'un moyen pour permettre des suivis anonymes en plus des réponses anonymes.
Pourquoi, plus d'une fois, ai-je vu cette affirmation insensée selon laquelle un "index" doit être exprimé en unités d'un octet ? C'est tout le contraire de la convention. Un "index" est généralement symbolique, une mesure dont le décalage physique en octets est déterminé par la taille de l'élément dans le tableau (ou le vecteur, qui peut même ne pas avoir la disposition physique d'un tableau, mais alors memcpy() n'est pas pertinent non plus bien sûr).
Ainsi, le 5e élément d'un tableau a pour "indice" 5, mais.. :
- Si le tableau est de type char, le décalage d'octet de cet "index" est de 5.
- Si le tableau est de type court (sur x86), le décalage d'octet de cet "index" est de 10.
- Si le tableau est de type int (sur x86), le décalage d'octet de cet "index" est de 20.
- Si le tableau est du type d'un grand objet de 48 octets, le décalage d'octets de cet "index" est de 240.
La question de savoir quelle est la bonne façon d'accéder à cet élément spécifique est une question secondaire. L'important est que vous compreniez la différence, que vous choisissiez l'une d'entre elles et que vous fassiez en sorte que le code soit correct.
Sur le sens des mots, je préférerais lire :
void* memcpy_offset(void *s1, const void *s2, size_t offset, size_t n);
que :
void* memcpy_index(void *s1, const void *s2, size_t index, size_t n);
Je trouve que l'idée qu'un void * complètement générique puisse avoir un "index" est trompeuse. (Pendant que nous y sommes, "dest" et "source" ou "in" et "out" seraient beaucoup moins ambigus que "s1" et "s2". Le code n'a pas besoin d'autant de commentaires lorsque vous choisissez des noms de variables explicites).