Que se passe-t-il ici en termes d'allocation? Est-ce une situation défectueuse d'utiliser des pointeurs comme celui-ci?
3 Réponses :
Qu'est-ce que je devinez em> strong> Votre question est à propos, c'est l'assignation dans la fonction C'est une affectation entièrement valide et fonctionne comme n'importe quelle autre affectation. p> Considérez ce code: P> f code> F code> . P>
void f(int p)
{
p = 0;
}
int main(void)
{
int q;
q = 1;
f(q);
}
Chaque fois que vous demandez une allocation sur le tas avec MALLOC par exemple, vous devez le libérer, si vous ne recevez pas une fuite de mémoire, donc pour 2 Mallocs ici, vous devez utiliser 2 libertés.
Et vous devez Gardez à l'esprit que lorsque vous envoyez Q à la fonction que vous l'envoyez par valeur Donc, si vous vérifiez * Q en Main, il restera toujours 1. p>
Si vous souhaitez modifier la valeur q indique dans la fonction que vous pouvez envoyer F (int **). p>
Dans votre exemple, un moyen d'aller si vous souhaitez modifier un point d'affichage dans lequel un pointeur pointe et pour éviter la fuite de mémoire est la suivante: P>
#include <stdio.h> #include <stdlib.h> #include <string.h> void f(int** p) { free(*p); /*first free the initial main allocated memory on heap */ *p = malloc(sizeof(int)); /*now the pointer is pointing to the new allocation */ if(NULL == *p) { return; } **p = 0; } int main(){ int *q = NULL; q = malloc(sizeof(int)); /*ask for memory allocation */ if(NULL != q) { *q = 1; f(&q); printf("%d\n", *q); /*now pointer is pointing to the allocationasked for by f */ free(q); /*free the allocated place on heap */ } return 0; }
Je suppose que "vous pouvez envoyer f (int **)" code> est une autre façon de dire que vous devez passer l'adresse de i> le pointeur sur la fonction afin d'assigner le démarrage Adresse du bloc nouvellement attribué que la valeur du pointeur est passée à la fonction afin que le changement soit visible dans l'appelant.
@ Davidc.Rankin qui est un moyen très articulé d'expliquer que, merci de votre note.
Je savais ce que tu voulais dire, mais l'OP peut avoir du mal à se débatter. En outre, vous voudrez peut-être ranger (supprimer) le casting de MALLOC CODE> - voir: Dois-je lancer le résultat de malloc? (et il serait bien de montrer une validation que le retour n'était pas
null code>). Autre que votre code va bien.
La réponse courte est que Vous pouvez le voir en utilisant quelques impressions. P> p code> et
q code> sont des variables indépendantes. Donc, le premier
p code> sera attribué la même valeur que
q code>, puis
p code> obtient une nouvelle valeur en raison du
malloc code> .
q code> n'est pas modifié par l'appel de la fonction. Cependant, il existe une fuite de mémoire dû à
p code> (et
q code>) non libéré.
q is now 0x1912010 // In main q is initialized
q points to the value 1 // In main the location q points to is initialized
--------------------
p is now 0x1912010 // In function p first has the same value as q
p points to the value 1 // so it also points to the same as q
--------------------
p is now 0x1913040 // In function p gets a new value due to malloc
p points to the value 0 // and the pointed to memory gets a new value
--------------------
q is now 0x1912010 // Back in main q is the same as before the function call
q points to the value 1 // and the pointed to memory is unchanged as well
Ne jamais lancer le résultat de Malloc.
Une phrase ou deux environ les paramètres C étant passée-by-value i> et comment éviter la fonction de réception d'une copie du pointeur (avec une adresse très propre et très différente), passant l'adresse de i> le pointeur d'origine de principal () code> serait requis.
Eh bien, vous manquez des directives
#include code>, vous avez la mauvaise signature pour
Main code>
, et c'est une fuite de mémoire dans la fonctionF code>. Autre que cela, il n'y a rien de mal avec le code comme vous le montrez. Peut-être que vous lancez le résultat de
malloc code>, que vous Ne devrait pas faire .
1. Pour chaque
malloc () code>, il faut être un
gratuit () code>. Les fuites peuvent être gênantes. 2. Casting
Void * Code> en C est rarement une bonne idée. Spécifiquement, seulement pour fonctionner les pointeurs comme une nécessité de la matière lorsque cela est permis. 3.
Tailleof (type) code> est beaucoup plus sujet à une erreur que
Tailleof * pointeur code>. 4.
p code> dans
f () code> peut démarrer initialisé à la valeur de
q code>, mais est autrement indépendant.