Puis-je faire de l'arithmétique sur des pointeurs void * en C?
est-ce valable
void *p = &X; /* some thing */
p += 12;
et si oui, quelles ne p point maintenant?
J'ai (troisième partie) du code qui fait cela (et compile proprement) et ma conjecture est que le void * a été traitée comme un char *. Mon fidèle K&R est silencieux(ish) sur le thème de
EDIT: Mon petit test app fonctionne très bien sur gcc 4.1.1 et traite void * char *. Mais g++ barfs
Je sais comment le faire correctement. J'ai besoin de savoir si je dois nettoyer la base de code pour trouver tous les lieux de son fait.
BTW gcc-pédant lance un avertissement
Résumé:
Le C spec est ambigu. Il indique qu'en termes de représentation et de les utiliser comme paramètres de la fonction void* =char*. Mais il est muet sur l'arithmétique des pointeurs.
- gcc (4) les permis et il les traite comme
char * - g++ refuse
- gcc-pédant avertit à ce sujet
- vs2010 à la fois le c et le c++
refuse
source d'informationauteur pm100
Vous devez vous connecter pour publier un commentaire.
Cela dépend du compilateur. Celles qui permettent d'envisager de sizeof(*(void *)) 1.
EDIT: c'est seulement pour annuler l'arithmétique des pointeurs. Il n'aurait pas de sens en utilisant dans ce cas les étapes de sizeof(int) ou de 0. La commune attentes de quelqu'un qui l'utilise qui serait le plus petit possible.
Non ce n'est pas légal. Un
void*
ne peut être arbitrairement incrémenté. Il doit être lancé pour un type spécifique de la première.Si vous voulez incrémenter par un nombre déterminé d'octets, alors c'est la solution que j'utilise.
La
char
type est pratique car il a une taille définie de 1 octet.MODIFIER
Il est intéressant que ça fonctionne sur gcc avec un avertissement. Je l'ai testé sur Visual Studio 2010 et vérifié qu'il ne compile pas. Ma compréhension limitée de la norme serait de dire que gcc dans l'erreur ici. Pouvez-vous l'ajouter à la suite de la compilation des drapeaux
Pour citer le spec:
Un pointeur sur void n'est pas un pointeur vers un type d'objet, par ces extraits:
Par conséquent, l'arithmétique des pointeurs est pas défini pour pointeur sur void types.
Votre supposition est correcte.
Dans la norme ISO C99, la section 6.2.5 paragraphe 26), il déclare que nul pointeurs les pointeurs de caractère sera la même représentation et l'alignement des exigences (paraphrase).
Vous voudrez peut-être avoir un regard sur les haut voté de réponse à cette question
L'arithmétique des pointeurs pour les nuls pointeur en C
Je ne pense pas que vous le pouvez, car il ne connaît pas son type, ne peut donc pas demander le nombre exact d'octets.
Jette à un premier type, c'est à dire
(int)
.