函数退出后,堆栈指针变化了,但是堆栈(一片内存)中的数据并没有立即释放或改变。如果函数退出后到WM_MYMSG消息被处理前 以及 该消息被处理的过程中,该函数所分配堆栈处的内存没有被其他函数、线程、进程使用,即没有写操作,那么str[128]中的数据依然存在。所以根据该内存物理地址读出数据的结果是正确的。但是这样的设计危险的!谁能保证该片内存不会被修改呢?而且这样的设计不符合逻辑,临时变量的作用域超出了规范所规定的范围。好像侯捷《深入浅出mfc》中讲c++的时候有讲到这一点。

解决方案 »

  1.   

    感谢jimconrad(jimmy)上述答复!我正在读《深入浅出mfc》,好书!但线程相关的内容很少。
    问题继续,请注意上述循环
    while(1) {
    if(...) return 0;
    char str[128];
    ...
    ::PostMessage((HWND)lParam,WM_MYMSG,(WPARAM)&str,0);
    }
    我认为当PostMessage()结束,开始新一轮while循环时,str[128]已经超出生存期 ,且在新的周期中堆栈当然被重用.那么在主控程序处理消息时,得到的数据应该是错乱的才合逻辑,可惜事实不是这样。
    我在while循环中设置了计数,并将每次的str[128]输出到文件;在主控程序收到消息通知后,也同样处理。结果是:两个计数相等,两个输出文件相同。