C++ 我的编译器是否在将正确的代码优化为无用的崩溃代码?

C++ 我的编译器是否在将正确的代码优化为无用的崩溃代码?,c++,C++,我试图编写一个函数,在多个消息框中显示系统中所有线程所属进程的PID void CheckProcess() { LPCSTR blahzix; HANDLE tsnap = CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD, 0); THREADENTRY32 tentry; tentry.dwSize = sizeof (tentry); BOOL CRec = Thread32First(tsnap, &tentry); GetLastErro

我试图编写一个函数,在多个消息框中显示系统中所有线程所属进程的PID

void CheckProcess()
{
LPCSTR blahzix;
HANDLE tsnap = CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD, 0);
THREADENTRY32 tentry;
tentry.dwSize = sizeof (tentry);
BOOL CRec = Thread32First(tsnap, &tentry);
GetLastError();
while (CRec)
{
    blahzix = tentry.th32OwnerProcessID;
    MessageBox (NULL, NULL, blahzix, MB_OK);
    CRec = Thread32Next(tsnap, &tentry);
}
CloseHandle(tsnap);
}

我不明白为什么这会有一段时间不起作用,所以我在OllyDBG中打开它,发现
MessageBox
的代码让它的第三个参数直接接收PID数据,而不是接收将PID存储为字符串的地址,当
MessageBox
函数尝试访问存储在0000000 4的数据时,导致访问冲突。如果我删除行
blahzix=tentry.th32OwnerProcessID
并附加第三行如下所示:
LPCSTR blahzix=“anything”
然后正确地显示一个标题为anything的MessageBox,而不是崩溃
MessageBox

为什么会发生这种情况?我认为编译器决定“变量blahzix除了在messagebox函数中之外,在任何地方都不会使用,并且它总是等于tentry.th32OwnerProcessID,所以它们可能是同一个变量,我将去掉它,让messagebox使用该变量。”


编辑:让我重新表述我的问题。如果LPCSTR blahzix=“fdisaf”使用=运算符,并且=运算符应该将左侧变量的值更改为右侧数据或变量的值,那么为什么使用它为blahzix创建字符串是有效的呢?因为blahzix显然是实际的,所以我假设=运算符应该只更改变量指向的位置,而不是更改其中的内容。如何在此实例中使用=运算符更改它指向的字符串的数据并在此实例中使用:
blahzix=tentry.th32OwnerProcessID更改指针的数据而不是字符串的数据?=运算符不应该更改其中一个吗?如何使=运算符指定要更改的数据?

THREADENTRY32::th32OwnerProcessID
是一个DWORD,而不是一个字符串。将其指定给指针并将其视为字符串是没有意义的。它也是无效的(没有显式强制转换的约束冲突);我很惊讶这是怎么/为什么编译的

不要把自己的错误归咎于编译器。编译器错误非常非常罕见

blahzix = tentry.th32OwnerProcessID;
不将整数进程id转换为字符串。它只将进程id写入
blahzix
指向的地址。您在此地址没有内存,因此尝试显示其中的字符串会导致未定义的行为。很可能发生撞车事故

要通过
MessageBox
将进程id显示为字符串,需要将其转换为
char
数组。给定C++11支持,您可以通过更改

blahzix = tentry.th32OwnerProcessID;
MessageBox (NULL, NULL, blahzix, MB_OK);

或者,如果你只限于使用C(问题被标记为C++,但是代码都是C),你可以使用< /P>

char str[12];
sprintf(str, "%d", tentry.th32OwnerProcessID);
MessageBox (NULL, NULL, str, MB_OK);

blahzix=tentry.th32OwnerProcessID
不会将pid转换为字符串-它只是将pid写入局部变量,使
blahzix
指向与pid相等的地址。我使用的是-fpermissive,这可能是编译它的原因。
char str[12];
sprintf(str, "%d", tentry.th32OwnerProcessID);
MessageBox (NULL, NULL, str, MB_OK);