web-dev-qa-db-fra.com

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 veux le faire sur place sans créer plus de variables.

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

33
Adam S

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

Vous pouvez cependant convertir le pointeur en char*, faites de l'arithmétique sur ce pointeur, puis reconvertissez-le en void*:

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

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

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

Aucune opération arithmatique 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 pointe. Vous pouvez convertir le pointeur en (char *) faire cela.

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

18
Alok Save

Incrémenter simplement le void* fonctionne avec 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, donc vous voulez le rendre explicite: transformez-le en char* puis de retour.

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

Cela rend évident que vous augmentez d'un certain nombre d'octets.

6
tdammers

Tu peux faire:

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