【发布时间】:2021-07-31 11:57:49
【问题描述】:
我正在用 Visual Studio 编写一个 c++ 程序,并且我已经编写了这段代码
DWORD GetProcIDByName(const char* procName) {
HANDLE hSnap;
BOOL done;
PROCESSENTRY32 procEntry;
ZeroMemory(&procEntry, sizeof(PROCESSENTRY32));
procEntry.dwSize = sizeof(PROCESSENTRY32);
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
done = Process32First(hSnap, &procEntry);
do {
/* here */ char file_str[sizeof(procEntry.szExeFile)];
int wc_convert = WideCharToMultiByte(CP_ACP, 0, procEntry.szExeFile, sizeof(procEntry.szExeFile), file_str, sizeof(file_str), NULL, NULL);
if (_strnicmp(file_str, procName, sizeof(file_str)) == 0) {
return procEntry.th32ProcessID;
}
} while (Process32Next(hSnap, &procEntry));
return 0;
}
为了将值 procEntry.szExeFile 从 WCHAR*(宽 unicode 字符数组)转换为标准 char* 进行比较,我必须为它创建一个 char* 缓冲区。我写了一行
char file_str[sizeof(procEntry.szExeFile)];
后来意识到我应该为这个缓冲区使用堆内存,它会根据进程名称改变大小,但我惊讶地发现我的 Visual Studio 对这段代码没有任何问题,而且我能够构建它没有编译器错误。我还没有运行它,我可能不会运行它,因为我想如果它运行,可能会出现缓冲区溢出和未定义的行为
我没有任何问题,但我很好奇为什么我能够编写此代码而不会出现编译器错误。如果在编译时不知道进程名,如何在栈上分配这个缓冲区?
【问题讨论】:
-
大小是不变量。
szExeFile成员是大小为MAX_PATH的数组。 -
@Dyskord docs.microsoft.com/en-us/cpp/c-runtime-library/reference/… 类似的东西?
标签: c++ compiler-errors stack dynamic-memory-allocation heap-memory