win32 API字符串类型-LPSTR和char之间的转换*

win32 API字符串类型-LPSTR和char之间的转换*,c,winapi,C,Winapi,我正在编写一个使用win32 API创建文件的函数 void createFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC) 我还编写了一个基于当前时间动态生成文件名的函数 char * getFilename() { char filename[200] = ""; char buf[40]; SYSTEMTIME st; GetSystemTime(&st);

我正在编写一个使用win32 API创建文件的函数

void createFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC)
我还编写了一个基于当前时间动态生成文件名的函数

char * getFilename() {
   char filename[200] = "";
   char buf[40];
   SYSTEMTIME st;
   GetSystemTime(&st);
   itoa(st.wHour, buf,10)
   strcat(filename,buf);
   .....
   return filename;
}
我调用上述函数,如下所示:

createFile(hwnd, getFilename, pbi, hBMP, hDC);
通过调试器,文件名是正确的,直到执行createFile()中的第一条语句,字符串突然变为“ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ


很明显,我有一些类型的错误,但我不确定如何修复它。我是win32 API的新手,在理解所使用的各种类型时遇到很多困难,因此如果您能帮助解决此问题,我将不胜感激。

您正在返回一个指向
filename
的指针,该指针已在
getFilename
内的堆栈上分配,因此在函数返回时将被释放

编辑:为避免混淆-内存分配在堆栈上,而不是堆上(通过
malloc
new
)。因此,“it is freed”并不是指调用
free
(或
delete
)。事实上,它不再是保留的。不再可用。解除分配。缺少字节。这是一个非缓冲区


对于一个解决方案,考虑将内存分配到<代码> GETFILNAME> <代码>。这可以由调用方在堆栈上完成,调用方将缓冲区作为参数传递。当然,可以选择使用字符串类。

它没有被释放,因为它从未被分配过-它是基于堆栈的数组,因此函数返回后访问该内存的行为是未定义的(通常/可能是不好的)。如果您澄清了这一点,并添加了从堆中分配内存的建议,这可能是一个很好的答案。“对象的生存期已经结束。”对象的幽灵可能会继续存在。“当然,如果实现语言有字符串类,使用字符串类将是一个选项。”。但是这个问题被标记为C,而不是C++。BTW,“γ……”来自编译器试图帮助。在调试构建中,当堆栈缓冲区超出范围时,MSVC会像这样填充它们,以帮助您找到这样的bug。如果它没有这样做,那么指针仍有可能指向包含您所期望的字符串的内存,并且即使它实际上是一个bug,它看起来也会工作。