46 votes

Incrémenter le pointeur vide d'un octet ? par deux ?

J'ai un pointeur vide appelé ptr . Je veux incrémenter cette valeur d'un certain nombre d'octets. Y a-t-il un moyen de faire cela?

Veuillez noter que je souhaite le faire sur place sans créer d'autres variables.

Puis-je faire quelque chose comme ptr = (void *)(++((char *) ptr)); ?

76voto

James McNellis Points 193607

Vous ne pouvez pas effectuer d'arithmétique sur un pointeur vide car l'arithmétique du pointeur est définie en fonction de la taille de l'objet pointé.

Vous pouvez cependant char* , faire de l'arithmétique sur ce pointeur, puis le reconvertir en void* :

 void* p = /* get a pointer somehow */;

// In C++:
p = static_cast<char*>(p) + 1;

// In C:
p = (char*)p + 1;

22voto

Alok Save Points 115848

Aucune opération arithmétique ne peut être effectuée sur le pointeur void

Le compilateur ne connaît pas la taille des éléments vers lesquels le pointeur void Vous pouvez convertir le pointeur en ( char * ) pour le faire.

Dans gcc, il existe une extension qui traite la taille d'un void comme 1 . on peut donc utiliser l'arithématique sur un void* pour ajouter un décalage en octets, mais son utilisation produirait du code non portable.

7voto

tdammers Points 14202

Le simple fait d'incrémenter le void* fonctionne dans gcc :

 #include <stdlib.h>
#include <stdio.h>

int main() {
    int i[] = { 23, 42 };
    void* a = &i;
    void* b = a + 4;
    printf("%i\n", *((int*)b));
    return 0;
}

C'est conceptuellement (et officiellement) faux, vous voulez donc le rendre explicite : transmettez-le à char* , puis inversez.

 void* a = get_me_a_pointer();
void* b = (void*)((char*)a + some_number);

Cela montre clairement que vous augmentez d'un certain nombre d'octets.

0voto

EyalSh Points 19

Tu peux faire:

 ++(*((char **)(&ptr)));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X