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

时间:2010-09-18 02:31:22

标签: c compiler-warnings

  

可能重复:
  Pointer to local variable

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

以下是整个代码:

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;
}

4 个答案:

答案 0 :(得分:8)

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

您需要使用malloc(和free)或其他动态分配。 E.g:

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

我省略了错误检查。然后,调用代码应该释放它。 MessageBox之后的_tWinMain

free(sMessage);

答案 1 :(得分:2)

考虑修改:

  LPTSTR GetApplicationPath ( HINSTANCE Instance )  

类似

  void GetApplicationPath ( HINSTANCE Instance, LPTSTR str )  

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

答案 2 :(得分:2)

更改

    _TCHAR sReturn[MAX_PATH];

在“GetApplicationPath”中

    static _TCHAR sReturn[MAX_PATH];

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

答案 3 :(得分:1)

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

要解决此问题,您可以动态地将空格sReturn分配为:

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