7
votes

Pointeur vide comme argument

Le snippet C suivant:

a1 address = (nil) 
f(a) address = (nil) 
a address = 0xb3f010 
data = 3
a1 address = (nil) 
Segmentation fault (core dumped)


3 commentaires

Recherchez "Pass par valeur".


Parce que vous le transmettez par valeur.


c-faq.com/ptrs/passptrinit.html


4 Réponses :


8
votes

Comme il s'agit de C, vous ne pouvez pas passer le pointeur par référence sans passer dans un pointeur sur le pointeur (par exemple, vide ** code> plutôt que vide * code> pour pointer sur le pointeur). Vous devez retourner le nouveau pointeur. Ce qui se passe: xxx pré>

pousse la valeur du pointeur ( null code>) comme valeur du paramètre de pile pour A code>. A code> prend cette valeur, puis réaffecte une nouvelle valeur (l'adresse malloc code> ed). Comme il a été passé par valeur, rien ne change pour A1 code>. P>

Si c'était C ++, vous pourriez obtenir ce que vous voulez en passant le pointeur par référence: P>

void f(void *&a);


2 commentaires

Dans C, vous pouvez le faire avec void f (vide ** a) .


@chris bon point. Moment de pet cérébral.



8
votes

Passer un pointeur sur A1 à votre fonction, vous ne peut pas modifier où a1 points. Le pointeur est passé par valeur , donc dans F1 Vous ne modifiez qu'une copie de l'adresse détenue par A . Si vous souhaitez modifier le pointeur, c'est-à-dire allouer une nouvelle mémoire pour le pointeur transmis, vous devrez alors passer un pointeur sur un pointeur : xxx


0 commentaires

4
votes

Pour modifier une variable via un appel de fonction, la fonction doit avoir la sémantique de référence en ce qui concerne l'argument. C n'a pas de variables de référence natives, mais peut implémenter la sémantique de référence au moyen de prendre des adresses et des pointeurs de passage.

Généralement: xxx

dans votre cas, le Chose est void * : xxx


0 commentaires

1
votes

Basé sur l'exemple de Kerrek SB, je suis venu avec ceci pour démontrer le point de signaleur de Void à un argument et comment il peut être utilisé. XXX


0 commentaires