我继承了以下代码行:
TCHAR temp[300];
GetModuleFileName(NULL, temp, 300);
但是,这会失败,因为前3个字节用垃圾值填充(但总是相同的,-128,-13,23,按此顺序)。我说,很好,并改为:
TCHAR temp[300];
ZeroMemory(temp, 300);
GetModuleFileName(NULL, temp, 300);
但垃圾值仍然存在!请注意,在ZeroMemory()调用之后,所有其他字节都被正确归零,并且在GetModuleFileName()之后,目录正确地存储在缓冲区中。好像temp被temp + 3取代了。这可能与字边界有关吗?
有人可以解释发生了什么以及如何解决它吗?
答案 0 :(得分:1)
ZeroMemory
以字节为单位,而你有一个300 TCHAR
的数组。这让我假设你正在使用widechar(不是多字节)编译选项。
您应该使用:
ZeroMemory(temp, 300 * sizeof(TCHAR));
或者在您的具体案例中:
ZeroMemory(temp, sizeof(temp));
但要小心后者。如果temp
是一个自动数组,其声明在函数中可见,则适用。如果它是一个指针,其分配大小对于编译器来说是“不可见的” - sizeof
将只给出指针的大小。