procedure TForm1.Button1Click(Sender: TObject);
var
Buf: array[0..9] of AnsiChar;
DataBuffer: pchar;
len: Integer;
begin
buf:='012345678';
len:=Length(buf);
GetMem(DataBuffer, len);
try
CopyMemory(DataBuffer, @Buf, len);
DataBuffer:=pchar('<test>'+DataBuffer);
len:=Length(DataBuffer);
//ReallocMemory(@Buf, len);//这里不知道是不是这样操作的
CopyMemory(@Buf, DataBuffer, len);
finally
FreeMem(DataBuffer);
end;
ShowMessage(buf);
end请问各位朋友,如何将新的DataBuffer值放到Buf里面,上面的操作时错误的咯,
var
Buf: array[0..9] of AnsiChar;
DataBuffer: pchar;
len: Integer;
begin
buf:='012345678';
len:=Length(buf);
GetMem(DataBuffer, len);
try
CopyMemory(DataBuffer, @Buf, len);
DataBuffer:=pchar('<test>'+DataBuffer);
len:=Length(DataBuffer);
//ReallocMemory(@Buf, len);//这里不知道是不是这样操作的
CopyMemory(@Buf, DataBuffer, len);
finally
FreeMem(DataBuffer);
end;
ShowMessage(buf);
end请问各位朋友,如何将新的DataBuffer值放到Buf里面,上面的操作时错误的咯,
解决方案 »
- TRichEdit 中 如何 把RVPrintPreview RichViewEdit 连接起来
- 怎么样才能枚举出系统当前加载的内核模块呢?
- 加载大数据的时候,我想显示一个动画, 可是一加载数据,整个界面都会失去响应,改咋解决?
- 哪位知道在dbgrid中对数据库进行编辑的时候,其过程具体是怎样的?
- fast report 2.5 做的报表怎么才能让fast report 2.46使用
- 请问如何将一个窗体嵌入另一个窗体的client区?
- 想散分都很难
- 请问在报表中如何让summary band或者group footer band内容显示在每一页的最底部。
- 在query中,每次打开程序时,自动按当天日期过滤数据,该怎么做??
- 自编控件是否可以公布数组类型的属性?如何公布?
- 送分100分:为何一个从DLL中返回的字符串在MEMO中不能正常显示
- 送分100分:在DELPHI6中使用FORMATSTR函数需要引用哪个单元
下面修改后的程序,不一定能完成你的功能,但是程序师正确的procedure TForm1.Button1Click(Sender: TObject);
var
Buf: array[0..9] of AnsiChar;
DataBuffer: PChar;
len: Integer;
begin
buf := '012345678';
len := Length(buf);
GetMem(DataBuffer, len);
try
//CopyMemory(DataBuffer, @Buf, len); 这句换成下面这句
Move(Buf[0], DataBuffer^, Len); //DataBuffer:=pchar('<test>'+DataBuffer); //这句是错误的,会导致刚刚用 GetMem 申请的内存丢失
//上面这句也超长了,len 是 10,因此DataBuffer也只有10个字节的长度
//应该换成下面这句
Move(PChar('<test>' + DataBuffer)^, DataBuffer^, Len);
//上面这句 move 实际上也是有问题的,因为PChar类型的数据需要以 #0来标识其结尾,
//上面这句吧DataBuffer都用数据填满了,这是危险的,如果以 DataBuffer 为参数调用操作 PChar 的函数可能会导致未知的错误
//例如 StrLen(DataBuffer) ,就可能返回大于10的一个数,这是不正确的
//但是因为下面的应用没有这样的函数调用操作,因此在这里,上面的这句move不会有问题 //len:=Length(DataBuffer); //这句也是错误的,PChar 类型的字符串使用 StrLen() 函数获得其字符串长度
//因为 DataBuffer 在前分配的内存大小是10字节,因此上面这句也是没有必要的
//ReallocMemory(@Buf, len);//这里不知道是不是这样操作的
//上面这句也是错误的,buf是栈中分配的内存,是不能通过 ReallocMemory 函数重新分配内存大小的
//只有在堆中分配的内存,才能使用 ReallocMemory 来重新分配内存 //CopyMemory(@Buf, DataBuffer, len); 这句换成下面这句
Move(DataBuffer^, Buf[0], Len); finally
FreeMem(DataBuffer);
end;
ShowMessage(buf);
end;上面的注释够详细了,呵呵
var
buf: array of AnsiChar;
begin
//分配一个包含10个字符的数组,从buf[0] 到 buf[9]
SetLength(Buf, 10);
......
//如果要重新设置数组的大小,则
SetLength(Buf, 20);
//上面是改变buf大小为包含20个字符的数组,从buf[0]到buf[19] //缩小buf数组,下面是重新设置数组为包含8个字符的数组
SetLength(Buf, 8); //动态数组不需要用户主动去释放其所占用的内存,函数结束的时候,系统会自动回收动态数组占用的内存
end;