警告C4172:返回局部变量的地址或临时

可能重复:
指向局部变量的指针

我已经在这个网站上阅读了很多关于同样问题的其他主题,因为我知道它很常见。 但我想我是愚蠢的,无法弄清楚这样做的正确方法。 所以,我为这些问题中的另一个道歉,我希望有人可以给我一个简单的解决方案和/或解释。

这是整个代码:

MAIN.C

#define WIN32_LEAN_AND_MEAN #include  #include  #include  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; } 

现在,您将返回自动(堆栈)数组的地址。 这总是错误的,因为一旦函数结束,那么内存的生命周期也是如此。

您需要使用malloc(和free)或其他动态分配。 例如:

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

我省略了错误检查。 然后,调用代码应该释放它。 在_tWinMainMessageBox之后:

 free(sMessage); 

更改

  _TCHAR sReturn [MAX_PATH]; 

在你的“GetApplicationPath”中

  static _TCHAR sReturn [MAX_PATH]; 

如果只有一个线程将调用GetApplicationPath(),则动态分配此字符串是过度的。 将局部变量标记为静态会使用全局变量为其分配空间,以便在退出函数时不会踩到空间。

考虑修改:

  LPTSTR GetApplicationPath ( HINSTANCE Instance ) 

喜欢的东西

  void GetApplicationPath ( HINSTANCE Instance, LPTSTR str ) 

这将消除返回局部变量的需要。

警告说明了一切。 在函数GetApplicationPath您将返回函数本地的sReturn 。 函数返回后,局部变量不再存在,并且在函数返回不正确后引用它们。

为了克服这个问题,你可以动态地分配空间sof sReturn

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