小弟我写了一个程序,使用了堆栈。我依次 将一些字符串压入堆栈中;
str:='xxxxx';Tstack.push(Pointer(str));
而且是运行多次,因此栈中应该有很多数据了。结果当我
char:Pchar;
char:=Tstack.pop;str:=char;
出栈后,发现数据完全不对了。不知道这是什么原因造成的。
str:='xxxxx';Tstack.push(Pointer(str));
而且是运行多次,因此栈中应该有很多数据了。结果当我
char:Pchar;
char:=Tstack.pop;str:=char;
出栈后,发现数据完全不对了。不知道这是什么原因造成的。
解决方案 »
- unidac连接池如何使用?
- 各位达人,从“DBGrdi”或者“EHlib”中导出数据的问题
- 一个关于界面技巧性的问题
- 根据条件把dbgrid中的某条记录显示为红色
- 怎样判断字段重复
- 超急:字段值的小数部分怎么被截短了呀?数据库里是numeric(18,10),却只能得到4位小数!
- 如何清内存
- 元旦送大礼!
- adoquery1在执行查询时显示错误:adoquery1:field 'myID' not find.是怎么回事?
- 深入SelectDirectory--它有bug!!??
- 关于强制类型转换的问题,请高手讲解。
- 超难问题!!!!! 如何知道自己的 "打印" 进程 成功执行完毕 ?? ???????急!!!!!!!!
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"
后面的都错了。不知道原因
出栈后用FreeMem给它释放内存。
当然还有个笨方法(如果你就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;
压栈就可以了
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
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)),不写就可
1.sizeof(str) //只能为4 ,那是指针的长度
2.strChar:=Pchar(str);
你已经用getmem给strchar分配了内存,又把它指向了str的内存,后面freemem时当然会Invalid pointer
正确的方法是将str数据拷入strChar