Renvoi du pointeur sur une structure locale

Est-il prudent de renvoyer le pointeur à une structure locale en C? Je veux dire fait ça

struct myStruct* GetStruct() { struct myStruct *str = (struct myStruct*)malloc(sizeof(struct myStruct)); //initialize struct members here return str; } 

sûr?
Merci.

Dans votre code, vous ne renvoyez pas de pointeur sur une structure locale. Vous retournez un pointeur sur un tampon malloc () ‘d qui réside sur le tas.

Donc, parfaitement en sécurité.

Cependant, l’appelant (ou l’appelant appelant ou l’appelé de l’appelant appelant, vous voyez l’idée) sera alors responsable de l’appel gratuit ().

Ce qui n’est pas sûr, c’est ceci:

 char *foo() { char bar[100]; // fill bar return bar; } 

Comme cela retourne un pointeur sur une partie de la mémoire qui se trouve sur la stack, il s’agit d’une variable locale et, à son retour, cette mémoire ne sera plus valide.

Tinkertim parle d ’” atsortingbution statique de barreaux et d’exclusion mutuelle “.

Sûr:

 char *foo() { static char bar[100]; // fill bar return bar; } 

Cela fonctionnera dans la mesure où il renverra un pointeur sur la barre de mémoire tampon allouée de manière statique. Alloué statiquement signifie que la barre est un global.

Ainsi, ce qui précède ne fonctionnera pas dans un environnement multi-thread où il pourrait y avoir des appels simultanés à foo() . Vous devez utiliser une sorte de primitive de synchronisation pour vous assurer que deux appels à foo() ne se piétinent pas. Il existe de très nombreuses primitives et modèles de synchronisation disponibles – qui, combinés au fait que la question portait sur un tampon malloc() rendent une telle discussion hors du champ d’application de cette question.

Pour être clair:

 // this is an allocation on the stack and cannot be safely returned char bar[100]; // this is just like the above; don't return it!! char *bar = alloca(100); // this is an allocation on the heap and **can** be safely returned, but you gotta free() malloc(100); // this is a global or static allocation of which there is only one per app session // you can return it safely, but you can't write to it from multiple threads without // dealing with synchronization issues! static char bar[100]; 

Pensez-y de cette façon: vous pouvez renvoyer un pointeur d’une fonction si la mémoire allouée à ce pointeur n’est pas locale à cette fonction (c’est-à-dire sur le cadre de stack de cette instance de cette fonction – pour être précis)