var
aa:array of string;
begin
getmem(aa,3);
aa[0]:='abcefg';
aa[1]:='adfs';
aa[2]:='adfsa'; //为何这里会报错,访问内存地址错误
freemem(aa);
end;如何用getmem对arry of string类型变量分配内存空间?
还请高手指点,谢谢!
aa:array of string;
begin
getmem(aa,3);
aa[0]:='abcefg';
aa[1]:='adfs';
aa[2]:='adfsa'; //为何这里会报错,访问内存地址错误
freemem(aa);
end;如何用getmem对arry of string类型变量分配内存空间?
还请高手指点,谢谢!
解决方案 »
- 在delphi里有ADOQuery作开发,怎么用insert作插入操作的时候,第一次就变成了编辑状态,然后取消再重新点击插入就没问题了,谢谢
- 如何让一个TSpeedButton 对象在TDBCtrlGrid正确显示
- 用Indy 9.0自带的 MailClient 例子应该如何改正(主要是解码的问题)?
- 如何保证c/s两端的数据一致性
- 关于pos机的开发
- 哪里有眼镜行业的进销存软件下载?
- 近期开发过程中遇到的一些不常见问题的解决方法(更新中)
- 高分紧急求救:多线程中传递参数错误
- 关于打包的问题?
- 怎样去掉richedit中每行中的硬回车,并进行段落重排
- inherited 的使用技巧
- 要求循环10秒后停止,我这段程序无法实现,请指教。
它实际还占用地址的低4和低8字节。
str: array of String;
begin
GetMem( POinter(str),3 * sizeof(String));
str[2] := '22342342342423';
Showmessage(str[2]);
FreeMem(Pointer(str));end;
function _NewAnsiString(length: Longint): Pointer;
var
P: PStrRec;
begin
Result := nil;
if length <= 0 then Exit;
// Alloc an extra null for strings with even length. This has no actual cost
// since the allocator will round up the request to an even size anyway.
// All widestring allocations have even length, and need a double null terminator.
GetMem(P, length + sizeof(StrRec) + 1 + ((length + 1) and 1));
Result := Pointer(Integer(P) + sizeof(StrRec));
P.length := length;
P.refcnt := 1;
PWideChar(Result)[length div 2] := #0; // length guaranteed >= 2
end;
能够对aa中的元素申请空间,所以,这时aa[0],aa[1],aa[2]3个指针都已经申请了地址空间。
而
GetMem(Pointer(aa),3*sizeof(string));只是把aa指针申请了3个空间,指针中的aa[0],aa[1],aa[2]都没有申请空间。所以调用aa[1]等会出错。如果非要用GetMem,试下这样(何必自找麻烦呢):var
aa:array of string;
begin
getmem(Pointer(aa),3*sizeof(string)); getmem(Pointer(aa[0]),sizeof(string));
getmem(Pointer(aa[1]),sizeof(string));
getmem(Pointer(aa[2]),sizeof(string)); aa[0]:='abcefg';
aa[1]:='adfs';
aa[2]:='adfsa';
freemem(aa);
为何不可以直接用getmem(aa,3*sizeof(string))申请空间?还是有些不明白,不知大侠是否能再指点一下,谢谢!