第一段代码有问题,new根据指针的类型分配内存,所以对于PChar来说,它也就分配一个字符的空间。赋3个字符显然越界了。
后一段代码有一点小问题。
getmem(pc,4); // 给\0留一个位置。

解决方案 »

  1.   

    我疏忽了
    为什么用new赋3个字符越界
    而用getmem可以赋多个字符?
    new和getmem到地有什么区别?
      

  2.   

    new通常是给某种类型的指针分配空间,大小就是那种类型变量的实际大小而getmem给某指针分配一块空间,大小最值于系统有关
      

  3.   

    new分配的指针一般这样定义
    pCount: ^Integer; (或PInteger)
    pnid: ^TNotifyIconData; (或PNotifyIconData)
    然后在使用时直接 new(pCount)就可以了而Getmem通常可以给任意的指针分配你想分配的内存大小
    Getmem(pCount, SizeOf(Integer));
    如果无类型指针,则必须用Getmem 如
    p:Pointer;
    Getmem(p, 20);给p分配20个字节的内存空间
      

  4.   

    那么Pchar为什么
    为什么用new赋3个字符越界
    而用getmem可以赋多个字符呢?
      

  5.   

    var
      pStr: PChar;
    begin
      pStr := '1234';
    end;
    不分配空间。
    照样OK,为什么?
      

  6.   

    new通常生成一个新指针,如楼上一些朋友所说,他对知道类型和固定内存大小的指针自动分配内存,例如一个PInteger,他会知道分配多少空间给他
    而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的函数时,必须分配空间,使用完毕后要释放。
      

  7.   

    看一看
    System中的New的实现
    New是一编译器内置的函数
    function _New(size: Longint; typeInfo: Pointer): Pointer;
    begin
      GetMem(Result, size);
      if Result <> nil then
        _Initialize(Result, typeInfo);
    end;
    编译器首先获取变量的大小,根据该指针的击类型来求得,并传递相应的类型信息指针,
    然后调用_Initialize来初始化字符串,动态数组,Variant, 接口变量,数组,记录等,
      

  8.   

    因此
    New(pc)
    因为pc是char类型的指针
    编译出来
    MOV EAX, $00000001
    Call @GetMem
    因为PChar指向的类型为基本类型
    所以就没有类型信息而如果pc为PString类型
    编译出来
    MOV EDX, [$00401080]
    MOV EAX, $00000004
    CALL @NEW
      

  9.   

    小弟很笨
    帮我分析一下代码:
    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;