2010-09-18 9 views
1

Possible en double:
Pointer to local variableavertissement C4172: adresse de retour de la variable locale ou temporaire

J'ai lu beaucoup d'autres sujets sur ce site sur le même problème sachant que ce serait être commun. Mais je suppose que je suis stupide et ne peux pas trouver la bonne façon de le faire. Donc, je m'excuse pour encore une de ces questions et j'espère que quelqu'un peut me donner une solution simple et/ou une explication.

Voici le code entier:

Main.c

#define WIN32_LEAN_AND_MEAN 

#include <Windows.h> 
#include <stdlib.h> 
#include <tchar.h> 


LPTSTR GetApplicationPath (HINSTANCE Instance); 


int APIENTRY _tWinMain (HINSTANCE Instance, HINSTANCE PreviousInstance, LPTSTR CommandLine, int Show) 
{ 
    LPTSTR sMessage = GetApplicationPath (Instance); 

    MessageBox (
     NULL, 
     sMessage, 
     _T ("Caption!"), 
     MB_OK 
    ); 

    return 0; 
} 


LPTSTR GetApplicationPath (HINSTANCE Instance) 
{ 
    _TCHAR sReturn[MAX_PATH]; 

    GetModuleFileName ((HMODULE) Instance, sReturn, MAX_PATH); 

    return sReturn; 
} 

Répondre

7

En ce moment, vous retournez l'adresse d'un tableau automatique (pile). C'est toujours erroné, car dès que la fonction se termine, la durée de vie de cette mémoire est également perdue.

Vous devez utiliser malloc (et free), ou toute autre allocation dynamique. E.g .:

_TCHAR *sReturn = malloc(sizeof(_TCHAR) * MAX_PATH); 

J'ai omis la vérification d'erreur. Plus tard, le code appelant devrait le libérer. Après la MessageBox dans _tWinMain:

free(sMessage); 
+0

Correction, merci. Apparemment, je dois attendre 9 minutes pour accepter, mais je le ferai. Merci encore. :) –

+0

Je devais juste ajouter un casting, je suis sûr que vous et tout le monde le sait déjà: _TCHAR * sReturn = (_TCHAR *) malloc (sizeof (_TCHAR) * MAX_PATH); –

+1

@guitar, vous n'avez * pas * besoin d'une distribution en C. Cela signifie probablement que vous utilisez vraiment C++. –

1

L'avertissement dit tout. Dans la fonction GetApplicationPath vous renvoyez sReturn qui est locale à la fonction. Les variables locales cessent d'exister une fois que la fonction retourne et la référence à celles-ci après le retour de la fonction est incorrecte.

Pour remédier à cela, vous pouvez allouer dynamiquement l'espace SOF sReturn comme:

sReturn = malloc(sizeof(_TCHAR) * MAX_PATH); 
+3

En C, le retour de 'malloc' ne devrait pas être casté. Lorsque vous oubliez d'inclure "stdlib.h" cela peut perdre des bits de votre adresse sur 64 archs ... Casting 'malloc' est une habitude C++. Là, vous devez le faire, mais vous devriez généralement utiliser 'new', de toute façon. –

2

Envisager de modifier:

LPTSTR GetApplicationPath (HINSTANCE Instance) 

à quelque chose comme

void GetApplicationPath (HINSTANCE Instance, LPTSTR str) 

Cela permettra d'éliminer la nécessité de revenir une variable locale.

+0

Vous pouvez le faire de cette façon, mais 'GetApplicationPath' devrait juste prendre un' LPTSTR', puisque vous êtes en train d'écrire des caractères à cet endroit, sans paramétrer la variable de l'appelant. En outre, il doit prendre un paramètre de longueur ou un document qui doit être 'MAX_PATH'. –

+0

@Matthew - J'ai corrigé le problème du pointeur que vous avez mentionné. THX. Je pensais que je laisserais le problème MAX_PATH que vous avez mentionné à l'imagination de l'utilisateur. L'argument pourrait vraiment être ce qu'ils préfèrent (par exemple, char pathname [MAX_PATH]). Bravo – skimobear

2

changement

 _TCHAR sReturn[MAX_PATH];

dans votre "GetApplicationPath" à

 static _TCHAR sReturn[MAX_PATH];

Si un seul thread va être appeler GetApplicationPath(), allocation dynamique de cette chaîne est surpuissant. Marquer une variable locale comme static lui alloue de l'espace avec les globals, de sorte que l'espace ne soit pas activé lorsque vous quittez la fonction.

+0

Cela n'a pas vraiment de sens de le faire à moins que vous n'optimisiez à la fois pour la pile et pour le tas. Généralement, personne ne se soucie d'optimiser l'utilisation de la pile, et il est plus sûr de ne pas présumer de la situation de threading. –

Questions connexes