【问题标题】:win32 API string types - conversion between LPSTR and char *win32 API 字符串类型 - LPSTR 和 char 之间的转换 *
【发布时间】:2012-06-04 00:02:33
【问题描述】:

我正在编写一个使用 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 的新手,在理解所使用的各种类型时遇到了很多麻烦,所以如果能帮助我解决这个问题,我将不胜感激

【问题讨论】:

  • 顺便说一句,“ÌÌÌ...”来自试图提供帮助的编译器。在调试版本中,MSVC 在超出范围时会像这样填充堆栈缓冲区,以帮助您找到这样的错误。如果它没有这样做,那么指针有可能仍然指向具有您期望的字符串的内存,并且即使它实际上是一个错误,它似乎也可以工作。

标签: c winapi


【解决方案1】:

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

编辑:为避免混淆 - 内存分配在堆栈上,而不是堆上(通过 mallocnew)。所以“它被释放”并不是指调用free(或delete)。而是因为它不再被保留。不再可供使用。解除分配。没有字节。这是一个非缓冲区。

对于解决方案,请考虑在getFileName 之外分配内存。这可以由调用者在堆栈上完成,调用者将缓冲区作为参数传递。当然,使用字符串类也是一种选择。

【讨论】:

  • 它不是freed,因为它从未被分配——它是一个基于堆栈的数组,因此在函数返回后访问此内存的行为是未定义的(通常/可能是坏的)。如果您澄清这一点,这可能是一个很好的答案,并添加了从堆分配内存的建议。
  • "对象的生命周期已经结束。"
  • 物体的幽灵可能会挥之不去。
  • “当然,使用字符串类是一种选择” 如果实现语言有字符串类。但问题被标记为 C,而不是 C++。
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 2015-10-08
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多