如何让delphi为一个结构分配一个连续的内存。(100)

L

loadymf

Unregistered / Unconfirmed
GUEST, post messages is not allowed!
#1
如下: MyRec=packed record i:integer;
j:integer;
s:string[12];
s1:string[12];
r:real;
end;
发现并不连续。有的数据中间有空档,有的没有。integer与string间有,string间没有。因为要以record为指针将record发送出去。
 
D

Dstorm

Unregistered / Unconfirmed
GUEST, post messages is not allowed!
#2
packed -> 内存对其!@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~给你一个笨方法,连续内存:var mem: Pointer;
pos: int64;
tem: Integer;
cem: array [0..3] of Char;
begin
tem := 10;
mem := AllocMem(100);
CopyMemory(mem, @tem, SizeOf(Integer));
pos := Integer(mem) + SizeOf(Integer);
CopyMemory(Pointer(pos), PChar('aaa'), 3);
tem := 0;
CopyMemory(@tem, mem, SizeOf(Integer));
pos := Integer(mem) + SizeOf(Integer);
cem := '';
CopyMemory(@cem, Pointer(pos), 3);
ShowMessage(cem);
FreeMem(mem);
end;
 

放飞

Unregistered / Unconfirmed
GUEST, post messages is not allowed!
#3
出现你这种疑问,是你对短字符串的结构不了解。Delphi中,使用 String[n]形式定义的字符串是短字符串,其结构如下:字符串的第一个字节(s[0])是字符串当前的长度,第二个字节(s[1])才是字符串真正开始的位置。所以,你上面定义的格式 s: String[12]实际长度是13个字节。如果你想定义12个字节的字符串,请使用字符数组。s: array[0..11] of AnsiChar
 
V

vvyang

Unregistered / Unconfirmed
GUEST, post messages is not allowed!
#4
楼上说的很对...Delphi 对记录类型的内存分配都是连续的,只要里面不含指针,尽管放心发送就是了...
 
L

loadymf

Unregistered / Unconfirmed
GUEST, post messages is not allowed!
#5
分配理由,我采用了 放飞的方法,当然dstorm的也可以,不过代码要改变,不然不行。所以放飞的分数比较高。放飞的理论方面的解释很清楚的。