2015-11-15 2 views
-2

Lorsque vous allez à travers quelques-uns des liens sur des pointeurs vides, je l'ai vu deux types lors de la configuration et d'obtenir des valeurs de pointeurs vides,différentes façons de configurer et d'obtenir des valeurs de pointeur vide

int main() { 
    int i = 5; 

    //This is first way. 

    void *vPtr = (void *) i; 

    //printing value of *vPtr, 
    printf("Getting value in first way, %d\n", (int)vPtr); 

    //This is second way. 
    *vPtr = &i; 

    //printing in second way, 
    printf("Getting value in second way, %d\n", *((int*)vPtr)); 
} 

deux d'entre eux donnera la même valeur. Bien que j'ai eu une idée de la façon dont la deuxième méthode fonctionne, mais je ne suis pas entièrement sûr, comment la première méthode fonctionne. Quel serait le moyen idéal en traitant des pointeurs de vide parmi ces deux?

Pour la première méthode, il s'agit de l'extrait de code auquel je faisais référence. Bien qu'il passait longtemps type, je pourrais faire la même chose avec int aussi.

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define NUM_THREADS 5 

void *PrintHello(void *threadid) 
{ 
    long tid; 
    tid = (long)threadid; 
    printf("Hello World! It's me, thread #%ld!\n", tid); 
    pthread_exit(NULL); 
} 

int main(int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc; 
    long t; 
    for(t=0;t<NUM_THREADS;t++){ 
    printf("In main: creating thread %ld\n", t); 
    rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); 
    if (rc){ 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
     } 
    } 

    /* Last thing that main() should do */ 
    pthread_exit(NULL); 
} 
+2

Ne convertissez pas un pointeur en int! Pour imprimer une valeur de pointeur, utilisez le spécificateur de format correct '% p'. S'il vous plaît lire sur l'opération de pointeur, type coversion, etc. vous faites des choses très étranges (et fausses). – Olaf

+0

Salut @Olaf, J'ai ajouté l'extrait de code d'où la première méthode a été utilisée pour définir et obtenir des valeurs de pointeurs vide. – Kiran

Répondre

0

La première méthode utilise le pointeur comme espace de stockage pour votre entier; la seconde manière stocke l'entier séparément et utilise le pointeur void* pour pointer vers lui.

Les pointeurs peuvent contenir des adresses de mémoire. Les adresses mémoire étant essentiellement des valeurs numériques, les pointeurs sont capables de stocker des nombres. La gamme de ces nombres, cependant, dépend du système. Par exemple, vous pouvez réinterpréter un pointeur sous la forme d'un nombre entier en le passant à printf avec un spécificateur de format %p. La valeur numérique produite par printf est définie par le système, mais vous obtiendrez un nombre imprimé pour votre pointeur.

La deuxième approche est garantie de fonctionner. De plus, si vous modifiez i, la valeur vue par le thread changera également.

Cela implique que la valeur pointée par le pointeur doit rester pendant la durée pendant laquelle le thread pourrait y accéder. Cela implique que si vous deviez modifier votre code de thread pour utiliser la seconde approche, un seul t ne serait pas suffisant; vous devez créer un tableau d'éléments NUM_THREADS et transmettre chaque thread une adresse à un élément différent.

La deuxième approche fonctionnera probablement sur la plupart des matériels, car int s'insère généralement dans un espace d'un pointeur. Cependant, la norme C99 ne donne aucune garantie à ce sujet. Une fois que vous avez effectué une affectation, les modifications apportées à i n'ont aucun effet sur la valeur entière vue par le thread. Vous pouvez trouver plus d'informations sur la conversion d'un int en void* en this Q&A.

0
void *vPtr = (void *) i; 

Cette interprètei comme un pointeur vers quelque chose. Dans votre exemple, vPtr pointe désormais vers l'adresse 0x00000005.

*vPtr = &i; 

Cela prend l'adresse de i.

Tout dépend de ce que vous voulez faire.