首页 新闻 赞助 找找看

奇怪的delphi指针,有谁能告诉为什么?

0
悬赏园豆:10 [已解决问题] 解决于 2013-10-01 13:33
type
 Arec=record
 Name:string;
 Age:integer;
 end;
var
  p: ^Arec;
  i,num: Integer;


 const
    MaxSize = $fff0 div sizeof(Arec);

type
  ArrPoint = array of Arec; {用于转换的自定义类型}
begin
  Num:=MaxSize;
  try
    p := GetMemory((num) * SizeOf(Arec));

    for i := 0 to Num-1 do
    begin
      ArrPoint(p)[i].Name := '张三'+inttostr(i);
      ArrPoint(p)[i].Age :=i;
      self.Memo1.Lines.Add(ArrPoint(p)[i].Name+',年龄:'+inttostr(ArrPoint(p)[i].Age));
    end;
   finally
    FreeMemory(p);
  end;

end;

以上代码中,如果将MaxSize的值改成1000,程序运行将出错,为什么?各位大侠?

向北方的主页 向北方 | 初学一级 | 园豆:154
提问于:2013-08-28 13:46
< >
分享
最佳答案
0

因为string在recrod里面实际是一个指针, 值存在另一个地址空间里

如果你正常使用new来给结构体指针分配内存的时候 会自动吧这些指针初始化为0, 这样在赋值的时候就没问题了

但是你使用GetMemory来分配内存, 并没有吧这段内存里的值初始化, 所以在给string赋值的时候不知道当时是什么值, 就认为是已经存在的一个地址, 再赋值的时候就会报地址访问的错误

 

修改办法:在p := GetMemory((num) * SizeOf(Arec));后面加一句FillChar(p^, num*sizeof(arec), 0);

就可以了

 

至于使用MaxSize没有报错, 估计是因为分配的地址太大所以吧string指向的地方都覆盖了所以不会报访问错误的问题

收获园豆:10
黑暗煎饼果子 | 菜鸟二级 |园豆:354 | 2013-09-18 09:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册