c \ c++转换为C# [已关闭]

gudnpqoy  于 2022-12-03  发布在  C#
关注(0)|答案(2)|浏览(195)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

六年前就关门了。
此帖子已在20天前编辑并提交审核,未能重新打开帖子:
原始关闭原因未解决
Improve this question
我如何将下面的结构转换成c#?2类型后面的括号表示数组还是为每个值留出多少内存?

typedef struct Cake{
    uint8          sysnulls_[2];
    char           Pie[21];
    uint8          MuffinCount[10];
    uint8          NumOfCookies[6];
} Cake;
iszxjhcz

iszxjhcz1#

你的猜测不正确。
所有这些成员都是数组。
uint8 sysnulls_[2];意味着sysnulls_是2 × uint8的数组。
同样,char Pie[21];意味着Pie是21个char的数组,依此类推。
uint8不是一个标准的C类型,它可能是一个无符号的8位整数,但是如果你想确定的话,你应该看看它是如何定义的。

6l7fqoea

6l7fqoea2#

数组中元素的个数,而不是字节的个数。
2个int8 sysnulls_可通过以下方式访问:

Cake gateaux;

gateaux.sysnulls_[0]; // first one
gateaux.sysnulls_[1]; // second one.

在这个例子中,sysnulls_数组确实占用了2个字节的内存,这只是因为每个uint8占用了一个字节,所以区分元素数和字节数是很重要的。
如果你有

typedef struct Cake{
    uint16          sysnulls_[2];
    char           Pie[21];
    uint8          MuffinCount[10];
    uint8          NumOfCookies[6];
} Cake;

每个sysnulls_元素将占用2个字节,并且分配给sysnulls_阵列的总空间将是4个字节。
此外,结构的大小NOT总是等于各部分的总和。这是因为大多数编译器会添加填充,以使每个元素在2、4或8字节边界上对齐。
如果编译器使用4字节对齐,那么在您的示例中,sysnulls_将位于偏移量0处。然后,将有2个字节的空间将Pie放置在偏移量4处。这将使我们在pie的末尾找到偏移量25。编译器将再次添加另外3个字节的填充,以确保MuffinCount从偏移量28处开始(7 x 4). NumOfCookies将从偏移量36处开始(在其前面有一个填充2),并且总结构大小将是44(向上舍入到最接近的4的倍数)。
大多数编译器都有编译器选项来设置默认打包,还有编译指示来控制给定结构的打包。

相关问题