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,程序运行将出错,为什么?各位大侠?
因为string在recrod里面实际是一个指针, 值存在另一个地址空间里
如果你正常使用new来给结构体指针分配内存的时候 会自动吧这些指针初始化为0, 这样在赋值的时候就没问题了
但是你使用GetMemory来分配内存, 并没有吧这段内存里的值初始化, 所以在给string赋值的时候不知道当时是什么值, 就认为是已经存在的一个地址, 再赋值的时候就会报地址访问的错误
修改办法:在p := GetMemory((num) * SizeOf(Arec));后面加一句FillChar(p^, num*sizeof(arec), 0);
就可以了
至于使用MaxSize没有报错, 估计是因为分配的地址太大所以吧string指向的地方都覆盖了所以不会报访问错误的问题