数组向动态分配的结构体拷贝出错(静态的正常)(100分)

  • 主题发起人 主题发起人 VictorWoo
  • 开始时间 开始时间
V

VictorWoo

Unregistered / Unconfirmed
GUEST, unregistred user!
//数组向动态结构体赋值的时候出错,能否指出为什么?
//我想会不会是setlength分配的在栈区,内存不连续了?
//以下代码可以直接拷贝进去执行,谢谢
procedure TForm1.btn1Click(Sender: TObject);
type
TMySubRecord = record //5 bytes
x: array[0..1] of Char;
y: array[0..2] of Char;
end;
TMyRecord = record //2 + 5 * x
a: array[0..1] of Char;
b: array of TMySubRecord
//如果是静态下标的没问题
end;
var
MyArray: array[0..100] of Char;
MySubRecord: TMySubRecord;
MyRecord: TMyRecord;
i: Integer;
begin
SetLength(MyRecord.b, 2)
//把b定义成静态的,不用setlength就没问题
for i := 0 to 99 do
begin
MyArray := Chr(i);
end;
CopyMemory(@MyRecord, @MyArray, 12);
//动态分配的,执行到这里溢出
Caption := 'Done';
end;
 
肯定不能这样用呀!
如果b是静态的,内存是连续的,所以可以用CopyMemory
如果是动态的,b实际上就是一个指针,你用CopyMemory当然出错啦!
 
啊,那对这类问题要怎么解决(解决即发分!)
比如说从串口获取了一个数据流,结构如下
MyRecord MySubRecord

╭──╮ ╭──╮
│长度│ │字段│
│ N │ │ 1 │
├──┤ ╱├──┤
│数据─→ │字段│
│ 1 │ ╲│ 2 │
├──┤ ╰──╯
│……│
│ │
├──┤ ╭──╮
│数据│ ╱│字段│
│ N ─→ │ 1 │
╰──╯ ╲├──┤
│字段│
│ 2 │
╰──╯
如何用结构体把它取出来?N是动态的,由开头的长度N决定
 
存储数据老实点不要省事
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3361299
 
谢谢,原来一个月前已经讨论得这么激烈了[^]
 
后退
顶部