Malloc à l'intérieur d'un appel de fonction semble être d'obtenir libéré sur le retour?
Je pense que j'ai eu le plus de base:
int main(int argc, char ** argv) {
int * arr;
foo(arr);
printf("car[3]=%d\n",arr[3]);
free (arr);
return 1;
}
void foo(int * arr) {
arr = (int*) malloc( sizeof(int)*25 );
arr[3] = 69;
}
La sortie est ceci:
> ./a.out
car[3]=-1869558540
a.out(4100) malloc: *** error for object 0x8fe01037: Non-aligned pointer
being freed
*** set a breakpoint in malloc_error_break to debug
>
Si quelqu'un peut jeter de la lumière sur l'endroit où ma compréhension est un échec, ce serait grandement apprécié.
Vous devez vous connecter pour publier un commentaire.
Vous passez le pointeur de la valeur, et non par référence, alors ce que vous faites avec arr à l'intérieur de foo va pas faire une différence à l'extérieur de l'foo-fonction.
Comme m_pGladiator écrit est une façon de déclarer une référence de pointeur comme ceci (seulement possible en C++ btw. C ne connaît pas les références):
Un autre (mieux à mon humble avis) est de ne pas passer le pointeur en argument, mais pour renvoyer un pointeur:
Et vous pouvez passer un pointeur vers un pointeur. C'est le C de manière à passer par référence. Complique la syntaxe un peu, mais bon c'est la façon dont C est...
Que vous avez alloué arr foo, mais les pointeurs valeur est stockée dans la pile d'appel. Si vous voulez le faire, faites comme ceci:
Et dans la principale, il suffit de passer un pointeur vers foo (comme foo(&arr))
foo reçoit une copie locale de l'int pointeur, alloactes de la mémoire et des fuites de mémoire quand elle est hors de portée.
Un moyen de corriger cela pour obtenir de foo pour retourner le pointeur:
Une autre est de passer foo un pointeur vers un pointeur
En C++, il est plus simple de modifier foo à accepter une référence à un pointeur. Le seul changement que vous avez besoin de C++ pour modifier foo
Depuis votre passez le pointeur de la valeur, l'arr pointeur à l'intérieur n'est pas en pointant vers la mémoire allouée. Cela signifie que deux chose: vous avez vous-même une fuite de mémoire (NON, la mémoire n'est pas libérée après la fonction foo complète), et lorsque vous accédez à l'arr pointeur à l'intérieur principal, vous accédez à certains arbitraire gamme de mémoire, donc vous n'obtenez pas 3 imprimé et donc free() refuse de travailler. Vous avez de la chance vous n'obtenez pas une erreur de segmentation lors de l'accès arr[3], à l'intérieur.
Vous ne pouvez pas modifier la valeur de votre argument (arr), si ce n'est pas passé par référence (&). En général, vous voulez retourner le pointeur, de sorte que votre méthode doit être:
arr=foo();
C'est mauvais juju pour tenter de réaffecter des arguments; je ne recommande pas l' (&) solution.