第一段代码有问题,new根据指针的类型分配内存,所以对于PChar来说,它也就分配一个字符的空间。赋3个字符显然越界了。
后一段代码有一点小问题。
getmem(pc,4); // 给\0留一个位置。
后一段代码有一点小问题。
getmem(pc,4); // 给\0留一个位置。
解决方案 »
- delphi程序运行后“File not found acDBTextFx”,请问是缺少什么样的第三方控件?
- 插入数据时,之前需要再查询条件,请教提高效率的方法。
- 请问怎样取得CxGrid的Summary统计数据?
- 定位打印的问题:新手请大家指点
- 如何简单的做到由User自己选择需要转档的栏位(找大虾)
- 请高手介绍一下动态数组的使用!!
- dephi4.0的源代码如何升级到6.0?
- 如何加密INI文件,使其像二进制文件一样但是用delphi regini可操作
- 为什么我的自定义纸张总是差两毫米
- 在delphi中,有没有判断字符串的函数
- 急!急!用Delphi如何做具有语音识别功能的程序?
- 在DELPHI 中怎么样用ADO 联接有密码的 Access 数据库?请高手帮一下忙好吗?
为什么用new赋3个字符越界
而用getmem可以赋多个字符?
new和getmem到地有什么区别?
pCount: ^Integer; (或PInteger)
pnid: ^TNotifyIconData; (或PNotifyIconData)
然后在使用时直接 new(pCount)就可以了而Getmem通常可以给任意的指针分配你想分配的内存大小
Getmem(pCount, SizeOf(Integer));
如果无类型指针,则必须用Getmem 如
p:Pointer;
Getmem(p, 20);给p分配20个字节的内存空间
为什么用new赋3个字符越界
而用getmem可以赋多个字符呢?
pStr: PChar;
begin
pStr := '1234';
end;
不分配空间。
照样OK,为什么?
而Pchar是一个不确定内存的指针类型,不能用new,而只能用getmem,allocmem为他确定空间。楼上的那位朋友,因为你赋了一个字符串常量,在生成机器码里,为自动为其分配空间,但是如果你使用你声明的这个变量来调用API函数人,例如:
var
pStr:Pchar;
begin
GetWindowDirectory(pStr,MAX_PATH);
end;
则肯定出错,因为没有分配空间接受。因此在调用之前要
var
pStr:Pchar;
begin
getMem(pStr,MAX_PATH);
GetWindowDirectory(pStr,MAX_PATH);
//do something with pStr
freemem(pStr);
end;最需要注意的当使用strPCopy,strCat等操作PChar的函数时,必须分配空间,使用完毕后要释放。
System中的New的实现
New是一编译器内置的函数
function _New(size: Longint; typeInfo: Pointer): Pointer;
begin
GetMem(Result, size);
if Result <> nil then
_Initialize(Result, typeInfo);
end;
编译器首先获取变量的大小,根据该指针的击类型来求得,并传递相应的类型信息指针,
然后调用_Initialize来初始化字符串,动态数组,Variant, 接口变量,数组,记录等,
New(pc)
因为pc是char类型的指针
编译出来
MOV EAX, $00000001
Call @GetMem
因为PChar指向的类型为基本类型
所以就没有类型信息而如果pc为PString类型
编译出来
MOV EDX, [$00401080]
MOV EAX, $00000004
CALL @NEW
帮我分析一下代码:
var
pc:Pchar;
ps:PString;
begin
new(ps);
ps^ := 'GOOD';
//ps值是一地址而ps^为一String,很怪ps的值如$CD382C 'GOOD'
//为什么在地址$CD382C 后还要加上'Good'
getmem(pc,20);
pc^ := '4'; //从编译器看pc的值不是一地址而是一个字符串
pc^ := 'd';
pc := '3333'; //既然pc应为一字符串,此处’3333‘仿佛不符合吧
end;