-2
votes

Pointeur non initialisé gratuit en C

Si je affectait de manière dynamique un espace pour un pointeur, répertoriez ceci: XXX

Dois-je libérer un moment où le code est effectué? Merci!


8 commentaires

L'espace pour le pointeur n'est pas alloué de manière dynamique, le int qu'il pointe de l'est. Lorsque le code est terminé, vous devez libérer avec gratuit (a); .


1. Ne pas lancer malloc . 2. C'est une bonne pratique pour libérer la mémoire allouée et est toujours recommandée, mais ce n'est pas nécessaire si vous utilisez le pointeur jusqu'à la fin absolue du programme.


Règle de la règle: tout ce qui a été alloué par MALLOC / calloc / realloc / doit être libéré avec gratuit à un moment donné.


Je pense que j'ai votre question maintenant. A n'est pas ininitialisé ici. Mais le int pointé par A est ininitialisé. Oui, vous devez libérer A un point.


@Jabberwocky: également STRUP , asprintf et VASPRINTF . Peut-être d'autres?


Pourquoi vous ne devriez pas lancer un malloc: Stackoverflow.com/Questtions/605845/...


@Abelenky correct, mais asprintf est une extension GCC et STRUP est POSIX.


ATTENTION: la valeur transmise à GRATUITE doit être exactement la même comme on a été obtenue à partir de MALLOC , pas une autre qui a été, par exemple, incrémentée. La valeur est sa seule identité, jusqu'à ce que gratuit est concerné.


4 Réponses :


0
votes

Oui. Si vous avez bien quelque chose avec succès, quelque chose est correct de le libérer aussi.

int *a = (int *) malloc(sizeof int);
if (a != NULL)
{
    /* Do whatever you need to do with a */
    free(a);
}
else
{
    puts("the malloc function failed to allocate an int");
}


7 commentaires

Il est sûr et bien défini à gratuit (null) .


ERR ..... Ce code ressemble plutôt à une inutile et la distribution n'est pas nécessaire.


Donc, pour une liste liée, comme nous savons que le premier nœud de la liste est vide, et nous devrions libérer le premier nœud à la fin du programme ??


@la météo. C'est vrai en C ++.


@Evilteach ... et en c


C17 § 7.22.3.3 si PTR est un pointeur NULL, aucune action ne se produit.


Je considère que je envisage que le code ici est vraiment inutile .... 1. libre (null); est un NOP de toute façon, 2. L'ensemble du code est inutile car la mémoire est libérée juste après Être alloué, le code n'est pas faux, c'est un mauvais exemple.



3
votes
int *a = malloc(sizeof(*a));
if (a) 
{
    /* a is now valid; use it: */
    *a = 1 + 2 + 3;
    printf("The value calculated is %d\n", *a);
}

/* Variable A is done being used; free the memory. */
free(a);  /* If a failed to be allocated, it is NULL, and this call is safe. */

0 commentaires

6
votes

Je pense que vous avez un peu de malentendus liée au pointeur.

Votre titre dit:

Pointeur non initialisé gratuit ...

et votre code est xxx

le problème avec ceci est qu'il y a pas de pointeur non inaicialisé dans le code. Le seul pointeur du code est la variable A et elle est initialisée par la valeur renvoyée par malloc .

liberté Un pointeur non initialisé serait mauvais - Exemple: xxx

mais que vous initialisez réellement le pointeur, vous devez appeler gratuitement lorsque vous êtes effectué à l'aide du pointeur d'objet / mémoire < Code> a points à. Peu importe que l'objet pointu à un objet (aka mémoire) a été attribué une valeur.

La règle générale: Pour chaque appel de Malloc Il doit y avoir un appel de libres

(exception: si votre programme se termine, vous n'avez pas besoin d'appeler gratuit )


0 commentaires

0
votes
free(a);

0 commentaires