Le snippet C suivant:
a1 address = (nil) f(a) address = (nil) a address = 0xb3f010 data = 3 a1 address = (nil) Segmentation fault (core dumped)
4 Réponses :
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, pousse la valeur du pointeur ( Si c'était C ++, vous pourriez obtenir ce que vous voulez en passant le pointeur par référence: P> vide ** code> plutôt que
vide * code> pour pointer sur le pointeur). Vous devez retourner le nouveau pointeur. Ce qui se passe:
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>
void f(void *&a);
Dans C, vous pouvez le faire avec void f (vide ** a) code>.
@chris bon point. Moment de pet cérébral.
Passer un pointeur sur A1 code> à votre fonction, vous ne peut pas em> modifier où
a1 code> points. Le pointeur est passé par valeur em>, donc dans
F1 code> Vous ne modifiez qu'une copie de l'adresse détenue par
A code>. 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 em>:
Pour modifier une variable via un appel de fonction, la fonction doit avoir la sémantique de référence em> 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: p> dans votre cas, le Chose code> est
void * code>: p>
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é.
Recherchez "Pass par valeur".
Parce que vous le transmettez par valeur.
c-faq.com/ptrs/passptrinit.html