0
votes

Que se passe-t-il exactement lorsque vous passez par le pointeur de valeur déjà alloué?

Que se passe-t-il ici en termes d'allocation? Est-ce une situation défectueuse d'utiliser des pointeurs comme celui-ci? XXX


2 commentaires

Eh bien, vous manquez des directives #include , vous avez la mauvaise signature pour Main , et c'est une fuite de mémoire dans la fonction F . 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 , que vous Ne devrait pas faire .


1. Pour chaque malloc () , il faut être un gratuit () . Les fuites peuvent être gênantes. 2. Casting Void * 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) est beaucoup plus sujet à une erreur que Tailleof * pointeur . 4. p dans f () peut démarrer initialisé à la valeur de q , mais est autrement indépendant.


3 Réponses :


0
votes

Qu'est-ce que je devinez em> strong> Votre question est à propos, c'est l'assignation xxx pré>

dans la fonction f code> F code> . P>

C'est une affectation entièrement valide et fonctionne comme n'importe quelle autre affectation. p>


Considérez ce code: P>

void f(int p)
{
    p = 0;
}

int main(void)
{
    int q;
    q = 1;
    f(q);
}


0 commentaires

0
votes

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;
   }


3 commentaires

Je suppose que "vous pouvez envoyer f (int **)" est une autre façon de dire que vous devez passer l'adresse de 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 - voir: Dois-je lancer le résultat de malloc? (et il serait bien de montrer une validation que le retour n'était pas null ). Autre que votre code va bien.



2
votes

La réponse courte est que 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é. ​​

Vous pouvez le voir en utilisant quelques impressions. P>

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


2 commentaires

Ne jamais lancer le résultat de Malloc.


Une phrase ou deux environ les paramètres C étant passée-by-value 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 le pointeur d'origine de principal () serait requis.