小弟我写了一个程序,使用了堆栈。我依次 将一些字符串压入堆栈中;
str:='xxxxx';Tstack.push(Pointer(str));
而且是运行多次,因此栈中应该有很多数据了。结果当我
char:Pchar;
char:=Tstack.pop;str:=char;
出栈后,发现数据完全不对了。不知道这是什么原因造成的。

解决方案 »

  1.   

    我也用过Tstack,没什么问题啊!把你的出错部分程序贴出来看看
      

  2.   

    这是我的代码:for i:=1 to 10 do
      begin
         str:='http://www.gosou.net/'+inttostr(i);
         TSSpider.Push(Pointer(str));
      end;
    for i:=1 to TSSpider.Count do
        begin
        tmpChar:=TSSPider.Pop;
        Url:=tmpChar;
        //extP2.Url := UrlStr;
        memo1.Lines.Add(url);    end;第一个出栈是正确的,是:"http://www.gosou.net/10"
    但是第二个出栈的,就错了,变成了"/10"
    后面的都错了。不知道原因
      

  3.   

    str改成Pchar类型,并且用GetMem给它分配内存
    出栈后用FreeMem给它释放内存。
      

  4.   

    楼上的说的没错,你的 str在每次都被重新赋值,且在每个过程结束后就释放了
    当然还有个笨方法(如果你就10个)
    在tform类中定义你的str,且为数组
     str:array [1..10] of string;
    然后用
    for i:=1 to 10 do
      begin
         str[i]:='http://www.gosou.net/'+inttostr(i);
         TSSpider.Push(Pointer(str[i]));
      end;
    压栈就可以了
      

  5.   

    我修改了一下:
    for i:=1 to 10 do
      begin
         str:='http://www.gosou.net/'+inttostr(i);
         GetMem(strChar,sizeof(str));
         strChar:=Pchar(str);
         TSSpider.Push(Pointer(strChar));
      end;for i:=1 to TSSpider.Count do
        begin
        tmpChar:=TSSPider.Pop;
        Url:=tmpChar;
         FreeMem(tmpChar,sizeof(tmpChar));
        memo1.Lines.Add(url);
        end;好象报错了。Invalid pointer
      

  6.   

    多个错:
    begin
    for i:=1 to 10 do
      begin
         str:='http://www.gosou.net/'+inttostr(i);
         GetMem(strChar,length(str)+1);   //不能用sizeof
         StrCopy(strchar,pchar(str));     //要用strcopy
         TSSpider.Push(Pointer(strChar));
      end;
    ...
    后面:
     FreeMem(tmpChar);  //不能用sizeof(tmpChar)),不写就可
      

  7.   

    给你个解释:
    1.sizeof(str) //只能为4 ,那是指针的长度
    2.strChar:=Pchar(str);
    你已经用getmem给strchar分配了内存,又把它指向了str的内存,后面freemem时当然会Invalid pointer
      正确的方法是将str数据拷入strChar