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 pourMain 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 demalloc code>, que vous Ne devrait pas faire .1. Pour chaque
malloc () code>, il faut être ungratuit () code>. Les fuites peuvent être gênantes. 2. CastingVoid * 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 queTailleof * pointeur code>. 4.p code> dansf () code> peut démarrer initialisé à la valeur deq code>, mais est autrement indépendant.