web-dev-qa-db-fra.com

Programmation C: lancer un pointeur vide dans un int?

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?

15
Tim

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));
32
Brian Roach

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_tafin que ce soit assez grand pour contenir n'importe quelle valeur de pointeur sur n'importe quelle plate-forme.

3
Boann

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.

0
Jo.Manurung

La cast est suffisante ..................

0
James