散分!讨论Delphi动态指针的问题。

flyinwuhan 2003-10-19 05:38:17
先声明一个使用动态指针的纪录类型:
type
TTest = record
dw : DWORD;
ary : Array of DWORD;
end;
pTest = ^TTest;

然后:
var
test : PTest;
p : PDWORD;
begin
test := AllocMem( sizeof(TTest) + sizeof(dword) * 2 );

setlength(test.ary,2);
test.dw :=12345;
test.ary[0] := 111;
test.ary[1] := 222;

p := PDWORD(test);//强制转化指针类型
Inc(p);
p^ := 333;

if P^ = test.ary[0] then ...//问题来了,此句引发异常,
//如果改为:
if P^ = PTset(test).ary[0] then...//再转化回来,也不行!


问题是:
1:delphi的强制指针转化是否可逆?
2:据说delphi动态指针是系统管理的,也就是说,我申请内存后,test.ary[0]在内存中的位置并不是紧接着test.dw, 上例中,改变了P^的值并不会改变test.ary[0],对吗?

问题可能有点难,讨论一下吧!
...全文
52 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyinwuhan 2003-10-19
  • 打赏
  • 举报
回复
哈哈哈!

确实!PWORD(p^)^:= 333;这样不会破坏test.

各位,解分!
pankun 2003-10-19
  • 打赏
  • 举报
回复
P := DWORD(Text)后, Text本身并没有改变!!
pankun 2003-10-19
  • 打赏
  • 举报
回复
怎么可能转化了又找不回原来的数据,我觉得这只是你自己的问题.
flyinwuhan 2003-10-19
  • 打赏
  • 举报
回复
可是!
我不想因为把test强制转化为pdword后就不用它了,怎么再把它转化回来呢?

或者Delphi中可不可以像C那样(PDWORD)Test 而不改变test的类型呢?
注意:
c可以这样:
(PDWORD)Test //得到了想要的但是并没有对test强制转化。
PDWORD(Test)//强制转化。

附:如果强制转化了带有动态数组的指针而又没办法找回原来的数据,Delphi也太差了,我决定放弃她!
hiflower 2003-10-19
  • 打赏
  • 举报
回复
p := PDWORD(test);//强制转化指针类型
Inc(p); //这里 p 的内容是指向 ary[0] 的指针值,而不是 ary[0] 本身
PWORD(p^)^:= 333; //再转换一次就行了,。
pankun 2003-10-19
  • 打赏
  • 举报
回复
我调试了的,PWORD(p^)^ := 333;后test.ary[0] := 333;
hatedeadlock 2003-10-19
  • 打赏
  • 举报
回复
PWORD(p^)^ 这样也不行 (但肯定不会出现异常)
但是P^绝对不是 楼主的结果
pankun 2003-10-19
  • 打赏
  • 举报
回复
上在应改写成这样
PWORD(p^)^ := 333;
就是指向这个指针指向的数据
pankun 2003-10-19
  • 打赏
  • 举报
回复
1:可逆 text := PText(P);
2:是紧跟着的.但上面是动态数据,只是存放的一个指向数组的指针,所以你改P^后,Test这个动态数组指针就不对了,所以出错.如果不是动态数组就不会出现这个问题.
ehom 2003-10-19
  • 打赏
  • 举报
回复
问题很简单,在此记录类型中ary是动态数组,那么这里的ary存储的是指针(否则),也就是说+ sizeof(dword) * 2就是多余的,sizeof(TTest)得到的就是记录类型的字节数,包括了指针.

由此得出
1.当然可以,很容易自己试出来,也很容易理解
2.记录中的数据当然连续,也很容易试出来,不是吗?

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧