2012-12-05 3 views
0

Telle est la définition de ma structureComment affecter une valeur à un membre d'un objet de type structure référentielle auto?

typedef struct treeNode 
    { 
     int data,pos; 
     char name[16]; 
     struct treeNode *left; 
     struct treeNode *right; 
    }treeNode; 

J'ai créé un objet dynamique

treeNode *temp; 
      temp = (treeNode *)malloc(sizeof(treeNode)); 

Si je dois attribuer une valeur aux données comment dois-je attribuer

scanf("%d",temp->data); //or 
scanf("%d",&(temp->data)); //why? because all scanf will look for is address to a location which could be done by temp->data; 

et cela vaut pour accéder aux données, c'est-à-dire comment accéder à la partie entière? a besoin de l'adresse de la variable

temp->data; //or 
*(temp->data) 
+0

[Ne pas lancer 'malloc'] (http://stackoverflow.com/a/605858/1848654). – melpomene

Répondre

2

scanf("%d",&temp->data);

Parce que scanf(). Pour chaque spécificateur de conversion, scanf() s'attend à ce que l'argument correspondant soit un pointeur sur le type correct:% d attend un argument de type int *,% f attend un argument de type double *,% c et% s attendent un argument de type char *, etc.

Behaviour of scanf() donne plus d'idée à propos de scanf().

pour accéder à temp->data est suffisant, car il est essentiellement équivalent à (*temp).data.

Si vous essayez d'accéder à *(temp->data), vous déclenchez un comportement indéfini. Parce que, vous accédez à un emplacement de mémoire qui peut être dans le contexte d'un autre processus.

disent tentation> données 100, * (tentation> données) signifie * (100), à savoir l'accès à l'emplacement de mémoire 100.

+0

temp-> data lui-même fait référence à une adresse. N'est-ce pas? –

+0

@amitgupta: Non – melpomene

+1

non il le déréférence. – Jeyaram

0

Chaque fois que vous souhaitez définir la valeur d'un paramètre qui est passé dans une fonction, vous devez envoyer l'adresse. Puisque vous voulez que scanf remplisse la valeur de ce paramètre, vous devez utiliser l'adresse. (Notez que si l'élément struct est déjà un pointeur (avec de la mémoire allouée), vous n'avez pas besoin de &). Cependant, lorsque vous voulez lire quelque chose, il n'est pas nécessaire d'utiliser l'adresse. Vous pouvez simplement l'utiliser directement.

+0

en cas d'assigner comme temp-> data le comportement est indéfini. Dans mon cas, je reçois une erreur d'exécution de "violation d'accès" que je pensais ne pas se produire plus tôt. Donc je veux clearifier les choses. –

+0

Il essaye de traiter n'importe quelle valeur dans temp-> data comme un pointeur. Cela va presque toujours pointer vers la mémoire non associée au processus, donc vous allez avoir des violations d'accès. – xaxxon

Questions connexes