关于CopyMemory的使用,我这里出了点问题。麻烦高手帮我看看!(50分)

  • 主题发起人 主题发起人 chriszx
  • 开始时间 开始时间
C

chriszx

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure MyProc(S: string);
var
pStr: ^string;
begin
New(pStr);
try
CopyMemory(pStr,@S,Length(S);
if pStr^ <> '' then
DoSomething;
else
DoSomething;
finally
Dispose(pStr);
end;
end;

代码如上,但不管S是不是为空,CopyMemory后的pStr^都为空值。不知为何?请高手指点。
 
你的string本来长度为0,new之后还是0。
既然是string,就不必这样写,直接写str := s;
否则:
var
pStr: pchar;
begin
getmem(pStr,Length(s);
CopyMemory(pStr,@S,Length(S);
...
FreeMemory(pStr);
end;
 
to zw84611:不行!我用你的方法试过了,如果我想把S得值通过CopyMemory给pStr的话,
按你的方法不行,到最后,pStr的值不为S。
 
CopyMemory(pStr,@S[1],Length(S);

我搞不懂你为什么要这样,其实完全没有必要。
 
string 本来就是指针,还有必要在用一个指向他的指针吗?

 
to zw84611: 不好意思,我知道这种情况下可以直接赋值。但这在我的一个程序中不得不
这样。因为我要把对方发送过来的数据包接收下来并分配到新的内存中,然后开个线程去
读他,最后处理数据/
 
to beta: 你来了?我是按你的方法作的,现在出了点问题。其实我先前用的方法是:
数据包来了后,我在我的程序里开个队列。然后开个线程去读他,最后分解处理!但我想
试试这两种方法那种更好,我想请教你,听听你的意见。
 
注意,我上面已经写了:

var
pStr: pchar;
s: string;
begin
s := 'hello';
getmem(pStr,Length(s));
CopyMemory(pStr,@S[1],Length(S));
~~~~
caption := pStr;
FreeMemory(pStr);
end;
 
行了,但你能说说我所用的方法那种更好?先给你20分。谢谢了
 
你用string 直接赋值,其实也就分配了空间,不必这样的。
 
字符串之间的拷贝,用 StrCopy 应该说是最直接的:
procedure MyProc(S: string);
var
pStr: string; // 这里,修改
begin
SetLength(pStr, Length(S)); // 这里,修改
try
StrLCopy(PChar(pStr), PChar(S), Length(S)); // 这里,修改
if pStr <> '' then // 这里,修改
DoSomething;
else
DoSomething;
finally
SetLength(pStr, 0); // 这里,修改
end;
end;
 
当然,你也可以直接进行字符串之间的赋值,介于 Delphi 的 Copy-On-Write 技术,
那也未尝不可。
 
很好阿!!

procedure MyProc(S: string);
var
pStr: pstring;
begin
getmem(pStr,Length(s));
try
CopyMemory(pStr,@S,Length(S));
if pStr^ <> '' then
Showmessage(pStr^); ///////////////
finally
FreeMem(pStr);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyProc('Abcd');
MyProc('1234567897');
end;
 
呵呵,jsxjd 老大的好像还是有点问题啊?
据我的理解对 STRING 这种特殊的指针好像要多来点内存吧?
...
getmem(pStr,Length(s) + 8);
try
CopyMemory(pStr,@S,Length(S) + 8);
...

否则试试 MyProc('A');
 
多谢各位,由于我白天没有多少时间分析,只能等晚上在看。
 
莫名其妙!

new(pStr);
pStr^:=S;

不就可以了!!!!
 
new(pStr); :这样是分配了多少空间?????????
 
一个指针,4个字节,怎么了,有错吗?
pStr^指向的字符串是在赋值的时候自动分配的,也就是 pStr^:=S的时候。

从来没见过string之间相互赋值要这么麻烦的!中国的程序员真没办法!
 
TO 一个过客:不好意思,我知道这种情况下可以直接赋值。但这在我的一个程序中不得不
这样。因为我要把对方发送过来的数据包接收下来并分配到新的内存中,然后开个线程去
读他,最后处理数据/[:D]
 
后退
顶部