gpt4 book ai didi

c# - 将结构转换为 intptr

转载 作者:太空宇宙 更新时间:2023-11-03 21:37:23 27 4
gpt4 key购买 nike

我有一个类定义如下:

[StructLayout(LayoutKind.Sequential)]
public class OUR_MEM_STR
{
public byte[] p;
public int len;
};

这是以下 C 结构的等效定义:

typedef struct
{
void *p;
int len;
} OUR_MEM_STR;

我对成员 p 使用 byte[] 而不是 IntPtr 类型,因为它在整个 c# 项目中的使用方式。

我已经定义了一个对象 obj,其中 len = 10 并且 p = new byte[10]

我想让它成为一个 intptr。我如何获得对象的大小?

 IntPtr pObj = Marshal.AllocHGlobal(obj.len + sizeof(int));
Marshal.StructureToPtr(obj, pObj, true);

看看我在那里做了什么。它似乎太硬编码了。如果我执行以下代码片段;

IntPtr pObj = Marshal.AllocHGlobal(Marshal.SizeOf(obj));

这样做会返回错误的大小,因为 obj.p 返回的大小是 4 而不是 10。因为指向字节数组的指针占用的内存是 4 个字节。

有没有更好的办法?

最佳答案

返回值正确,p是一个指针,占4字节。

你不能这样离开,有两个内存分配。编码器为数组分配了内存。它创建了一个 SAFEARRAY,一种 COM 数组类型。您的 C 代码不太可能对此感到满意。改为这样声明:

[StructLayout(LayoutKind.Sequential)]
public class OUR_MEM_STR {
public IntPtr p;
public int len;
};

并使用 Marshal.AllocHGlobal(10) 分配 p。不要忘记再次清理。

不要将 true 传递给 StructureToPtr(),AllocHGlobal() 分配的内存未初始化。那会随机地使你的程序崩溃。您必须传递 false

关于c# - 将结构转换为 intptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21055510/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com