Disons que j'ai un vide * nommé ptr. Comment devrais-je utiliser ptr pour stocker un int? Est-ce suffisant pour écrire
ptr = (void *)5;
Si je veux enregistrer le numéro 5? Ou dois-je malloc quelque chose pour le sauver?
Vous transformez 5
en tant que vide pointeur et l'attribuez à ptr
.
Now ptr pointe sur l'adresse mémoire 0x5
Si c'est ce que vous essayez de faire… eh bien, oui, ça marche. Tu… ne veux probablement pas faire ça.
Lorsque vous dites «stocker un entier», je suppose que vous voulez réellement stocker la valeur entière 5 dans la mémoire indiquée par le void*
. Tant qu'il y a assez de mémoire allouée (sizeof(int)
), vous pouvez le faire avec le casting ...
void *ptr = malloc(sizeof(int));
*((int*)ptr) = 5;
printf("%d\n",*((int*)ptr));
Cela fonctionnera sur toutes les plates-formes/environnements où sizeof(void*) >= sizeof(int)
, qui est probablement la plupart d’entre elles, mais je ne pense pas toutes. Vous n'êtes pas censé compter dessus.
Si vous le pouvez, vous devriez plutôt utiliser un syndicat:
union {
void *ptr;
int i;
};
Ensuite, vous pouvez être sûr qu'il y a de la place pour l'un ou l'autre type de données et vous n'avez pas besoin de transtypage. (N'essayez simplement pas de déréférencer le pointeur tant qu'il contient des données de non-pointeur.)
Sinon, si vous utilisez un int pour stocker une adresse, utilisez plutôt: size_t
intptr_t
afin que ce soit assez grand pour contenir n'importe quelle valeur de pointeur sur n'importe quelle plate-forme.
Un pointeur pointe toujours sur une adresse mémoire. Donc, si vous voulez enregistrer une variable avec un pointeur, vous voulez enregistrer dans ce pointeur l'adresse de la mémoire de votre variable.
La cast
est suffisante ..................