加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

X的动态数组的Delphi动态数组的内存布局是什么?

发布时间:2020-12-15 09:33:07 所属栏目:大数据 来源:网络整理
导读:我试图从C#调用Delphi DLL中的过程.该过程期望调用者预分配并输入TSomeRecord数组的数组,然后它将操作TSomeRecord元素作为返回结果的方法.所以,我需要手工制作Delphi数组的动态数组. 现在,I have found here,X的动态数组由指向动态数组的第一个元素的指针组
我试图从C#调用Delphi DLL中的过程.该过程期望调用者预分配并输入TSomeRecord数组的数组,然后它将操作TSomeRecord元素作为返回结果的方法.所以,我需要手工制作Delphi数组的动态数组.
现在,I have found here,X的动态数组由指向动态数组的第一个元素的指针组成,并且第一个元素具有引用计数和前面的数组的长度(元素数)(两个32位整数),并且元素是内联和连续存储的,因此整个内容在内存中看起来像这样:

rrrrllll000...000111...12...
        ^

rrrr是引用计数,llll是长度,0123是元素,^是指针指向的位置.这证明了;我测试了它,它的工作原理.
对于多维动态数组,我假设我可以用X的数组代替Y的数组,换句话说,外部维度只是动态数组的动态数组(如何指向):

rrrrllll000011112222...
        ^

其中元素0000,1111等现在是独立分配的动态数组的32位指针.但是,这样做会让我遇到麻烦的访问权限.这显然不是德尔福希望我这样做的方式.任何人都可以向我解释我应该如何做到这一点?

解决方法

动态数组是指向打包的元素块的指针.

因此TSomeRecord数组的数组是指向指针数组的指针,每个指针指向具有length(array [firstlevel])元素的块内存,如果没有则指向nil.

换句话说,你假设大致是正确的,并且添加了零元素的数组是零.请注意,除非您真的知道自己在做什么,否则不应该自己更改引用计数和长度.

如果没有示例代码,确定导致崩溃的原因将很困难.请记住,对于所有自动Delphi类型(宽字符串除外),所有动态内存必须由delphi内存管理器分配.

尝试使用您正在连接的任何语言的内存管理器是不可能的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读