procedure MyStr(p:PChar);stdcall;
begin
MessageBoxA(0,p,'提示',0) ;
end;procedure TForm1.Button1Click(Sender: TObject);
var
i,ThreadID : DWord;
begin
for i:= 1 to 3 do
CreateThread(nil, 0, @MyStr,PChar(IntToStr(i)), 0, ThreadID);
end;结果并不是 1 2 3 却是 2 3 3 有谁知道怎么回事?

解决方案 »

  1.   

    不是1 2 3,也不是所见到的2 3 3。而是不确定结果。IntToStr得到的是一个String对象,CreateThread执行完之后,该对象就被释放掉,剩下的就只有一个String对象原来的地址,被传递到MyStr当中去当成PChar使用。而在这一过程当中,该地址就有可能分配出去,并被修改为不可预知的数据内容。
      

  2.   

    其实 CreateThread 这个函数要求传递的参数本来就是地址,
    PCHAR 相当与c语言里的char *  很明显就是个指针;
    由于是多线程的原因,所以在这个过程中地址里的内容都有可能被替换掉。
    楼上说的有道理但我不赞同“CreateThread执行完之后,该对象就被释放掉,剩下的就只有一个String对象原来的地址”
    只有在这个程序段结束的时候对象才被释放的并不是在CreateThread之后就被释放了,只是内容被替换了
      

  3.   

    说“释放了”没错,指的是 IntToStr(i) 这个临时的 String 对象,其实只存于在CreateThread前后的极短时间内。