2010-09-18 141 views
1

可能重复:
Pointer to local variable警告C4172:返回局部变量的地址或临时

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

这里是整个代码:

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

回答

7

现在,你回自动(栈)阵列的地址。这是总是错误,因为只要函数结束,那么内存的使用寿命也是如此。

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

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

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

free(sMessage); 
+0

固定,谢谢。显然,我必须等待9分钟才能接受,但我会。再次感谢。 :) – 2010-09-18 02:37:39

+0

只需添加一个演员阵容,我相信你和每个人都已经知道这一点,但:_TCHAR * sReturn =(_TCHAR *)malloc(sizeof(_TCHAR)* MAX_PATH); – 2010-09-18 02:39:12

+1

@吉他,你不*需要在C中投射。这可能意味着你真的在使用C++。 – 2010-09-18 02:43:08

1

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

为了克服这一点,你可以动态SOF sReturn分配空间为:

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

在C中,'malloc'的返回不应该被转换。当忘记包含“stdlib.h”时,这可能会在64个arch上丢失你的地址的一小部分...... Casting'malloc'是C++习惯。你需要这样做,但无论如何你通常应该使用'new'。 – 2010-09-18 06:09:21

2

考虑修改:

LPTSTR GetApplicationPath (HINSTANCE Instance) 

喜欢的东西

void GetApplicationPath (HINSTANCE Instance, LPTSTR str) 

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

+0

你可以这样做,但'GetApplicationPath'应该只带一个'LPTSTR',因为你只是写了一个字符到那个位置,而不是设置调用者的变量。另外,它必须有一个长度参数或文档,它必须是'MAX_PATH'。 – 2010-09-18 02:41:33

+0

@Matthew - 我解决了你提到的指针问题。谢谢。我想我会把你提到的MAX_PATH问题留给用户的想象力。这个论点真的可以是他们喜欢的东西(例如char pathname [MAX_PATH])。干杯 – skimobear 2010-09-18 02:57:53

2

变化

 _TCHAR sReturn[MAX_PATH];
在 “GetApplicationPath”

 static _TCHAR sReturn[MAX_PATH];

如果只有一个线程将被调用GetApplicationPath(),动态地分配这个字符串是矫枉过正。将局部变量标记为静态为全局变量分配空间,以便在退出函数时不会占用空间。

+0

除非您针对堆栈和堆使用进行了优化,否则这样做并没有什么意义。一般来说,没有人会优化堆栈使用,并且不推测线程问题更安全。 – 2010-09-18 05:55:57

相关问题