为什么一个自定义结构类型的指针不能指向一个byte *data

ffb 2004-08-11 06:26:01
C++:
typedef struct
{
unsigned int fid; //
int filelen; //
char pname[MAX_PATH]; //
} NTCMD411;

to C#:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct NTCMD411
{
public uint fid; //
public int filelen; //
//[MarshalAs(UnmanagedType.LPStr, SizeConst = 255)]
//public string pname; //
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
public byte[] pname;
};

byte *data=(byte *)cmddata;
NTCMD411 *pNTCMD411=(NTCMD411 *)data;//error


data存放的是数据,我需要从中取出NTCMD411这个结构对应的数据(从数据头的第0字节开始).
我试验了如果结构中不包含数组就什么问题都没有,而我的pname需要保存文件名,这个结构是C++中定义的,我移植到C#.
为什么这个结构的指针不能指向这个数据呢?
...全文
121 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
csq0516 2004-08-12
  • 打赏
  • 举报
回复
up
herony420 2004-08-12
  • 打赏
  • 举报
回复
我觉得可能出在[MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]上面,你要通过指针传递,而结构默认在堆栈里,在你没有实例化这个结构的时候可能并没有真正的分配pname的内存,这样就不能和你的数据很好的对应,我不知道你的错误提示是什么,,
你试试首先对结构进行下构造如何呢?
public struct NTCMD411
{
public uint fid; //
public int filelen; //
//[MarshalAs(UnmanagedType.LPStr, SizeConst = 255)]
//public string pname; //
public byte[] pname;

public NTCMD411()
{
fid = 0;
filelen = 0;
pname = new byte[MAX_PATH];
}
};


mars131 2004-08-12
  • 打赏
  • 举报
回复
不懂啦!
不过帮你up一下
ffb 2004-08-12
  • 打赏
  • 举报
回复
说不能对托管类型操作等,各种各样的错误
构造函数我试验过了,无效

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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