首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetMem对一个PChar变量更改其他PChar变量的内容

GetMem对一个PChar变量更改其他PChar变量的内容
EN

Stack Overflow用户
提问于 2011-05-21 19:56:39
回答 2查看 2.8K关注 0票数 1

所以我有个折叠式的问题。我有两个PChar变量。我首先分配内存,执行一些操作,为第二个变量分配内存--在这个步骤中,第一个变量包含坏值(我在调试时看到了它)。以下是代码:

代码语言:javascript
复制
procedure TReadThread.Execute;
Var
  iRead, temp, i, count : Integer;
  header, params : PChar;
begin
  try
    GetMem(header, 12);
    iRead := recv(FSocket, header^, 12, 0);

    if (iRead<>12) then
      raise Exception.Create('Header recieving problem!');

    temp := StrToIntDef(String(copy(header,3,4)),0);

    if (temp=0) then
      raise Exception.Create('Body receiving problem!');

    count := temp*SizeOf(Char);

    if (count+12<=16384) then
      begin
        GetMem(params, count);
        iRead := recv(FSocket, params^, count, 0);

        if (iRead<>count) then
          raise Exception.Create('Cant recieve messsage fully!');
      end
    else
      raise Exception.Create('Bad message size (>16 KB)!');

    GetMem(FText, temp*SizeOf(Char)+12);
    FText := PChar(String(header) + String(params));

    FreeMem(header);
    FreeMem(params);
  except
    on E : Exception do
      ShowMessage(E.Message);
  end;
end;

在线上

代码语言:javascript
复制
iRead := recv(FSocket, params^, count, 0);

当我寻找变量头值时--我看到了一些令人惊奇的东西--与我在过程开始时看到的不一样。我怎么才能修好它?

EN

回答 2

Stack Overflow用户

发布于 2011-05-21 20:27:38

我猜想FTextPChar。既然您说您使用的是Delphi2010,那么您应该知道Char实际上是WideChar的同义词,宽2字节。我怀疑你真的想要使用AnsiChar

最突出的问题是,您为FText分配内存,然后将其与分配给FText的分配一起丢弃。更重要的是,当过程结束时,FText引用的内存将被销毁。

我认为你应该做以下几件事:

将calls.

  • Change AnsiString.

  • Stop的
  • 切换到AnsiChar,使用GetMem,并使用堆栈分配.

也许是这样的:

代码语言:javascript
复制
procedure TReadThread.Execute;
Var
  iRead, count: Integer;
  header: array [0..12-1] of AnsiChar;
  params: array [0..16384-1] of AnsiChar;
begin
  try
    iRead := recv(FSocket, header, 12, 0);

    if (iRead<>12) then
      raise Exception.Create('Header receiving problem!');

    count := StrToIntDef(Copy(header,3,4),0);

    if (count=0) then
      raise Exception.Create('Body receiving problem!');

    if (count+12<=16384) then
      begin
        iRead := recv(FSocket, params, count, 0);
        if (iRead<>count) then
          raise Exception.Create('Cant receive messsage fully!');
      end
    else
      raise Exception.Create('Bad message size (>16 KB)!');

    SetLength(FText, 12+count);
    Move(header, FText[1], 12);
    Move(params, FText[13], count);
  except
    on E : Exception do
      ShowMessage(E.Message);
  end;
end;
票数 3
EN

Stack Overflow用户

发布于 2011-06-28 08:33:25

就像大卫·赫弗南说的。Char是2字节,pChar指向Delphi2010中的Unicode字符。但是大卫的代码有两个问题

  1. 如果您想获得国际字符(unicode或utf8字符串),如果将params变量定义为AnsiChar的数组0.16384-1,则不能使用AnsiChar
  2. ,那么您将失去程序性能。局部变量将使用堆栈,并定义类似于David定义的参数将占用您的堆栈空间。

对于答案,您可以使用您的代码通过一个简单的更改。只将标头和params变量定义为PAnsiChar。你可以把其他代码不变。

标题,参数: PAnsiChar;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6084097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档