C# 如何知道类型结构属性的偏移值?

C# 如何知道类型结构属性的偏移值?,c#,c,c#-4.0,c#-3.0,C#,C,C# 4.0,C# 3.0,我想知道如何在C语言中获得结构的偏移量值 我把这个结构转换成c#。例如,如果log_level_offset的offset值为0,则与属性的下一个和其余部分的offset值类似 我的结构示例: typedef struct TestStruct { const AVClass *av_class; int log_level_offset; enum AVMediaType codec_type; const struct AVCodec *codec;

我想知道如何在C语言中获得结构的偏移量值 我把这个结构转换成c#。例如,如果log_level_offset的offset值为0,则与属性的下一个和其余部分的offset值类似

我的结构示例:

typedef struct TestStruct
{
    const AVClass *av_class;
    int log_level_offset;
    enum AVMediaType codec_type;
    const struct AVCodec  *codec;
    void *priv_data;
    int bit_rate_tolerance;
    uint8_t *extradata;
    int extradata_size;
    float b_quant_factor;
    uint16_t *intra_matrix;
    uint64_t channel_layout;
} TestStruct;
指针在c#中为4字节,通常定义为IntPtr。整数和浮点数是4字节。uint8是8个字节。见下文结构

        [StructLayout(LayoutKind.Sequential)]
        public struct TestStruct
        {
            IntPtr av_class;
            int log_level_offset;
            int codec_type;       //may be different depending on size of c language code
            IntPtr  codec;
            IntPtr priv_data;
            int bit_rate_tolerance;
            IntPtr extradata;
            int extradata_size;
            float b_quant_factor;
            IntPtr intra_matrix;
            ulong channel_layout;
        }

要知道中结构成员的字节位置,请使用stddef.h中的
offsetof
宏:

#include <stddef.h>

printf("%zu", offsetof(struct TestStruct, log_level_offset));
#包括
printf(“%zu”,偏移量(结构测试结构,日志级别偏移量));
%zu
,因为宏返回类型为
size\t
的整数)


请注意,这需要考虑潜在的填充字节,因此一个系统上的偏移量不一定与另一个系统上的相同

这将是一个很好的考题。虽然这个问题可能是由重写为C#引起的,但这个问题100%是关于C如何布局结构的,并且可能会从重写中受益,根本不提C#。如果您需要知道如何在C#之后布局类似的结构,那么这可能是一个新问题。我并不是说你必须从问题中去掉所有的C的痕迹,但我敢说,如果你用C而不是C来标记它,你会得到更好的答案。以字节为单位返回任何
结构
成员的
结构开头的偏移量。另外请注意,元素的大小(及其偏移量)在很大程度上取决于编译代码的平台。也可能会出现填充(请参见此处的“C结构填充”:和此处:)。alk:您提供的IEEE链接窃取了K&R在20世纪70年代早期编写的C语言文档。参考书目甚至说:“C参考手册”由Dennis M.Ritchie编写,其版本由Brian W.Kernighan和Dennis M.Ritchie,Prentice Hall,Inc.(1978)以C编程语言出版。版权归AT&T所有。“uint8是8字节”位不是字节(在C中)。还要注意C的结构填充。alk:它不是填充,而是对齐。填充将向结构中添加字节,并且大小将发生变化。对齐在2、4、8、16的倍数地址上启动对象。只有当您有一个结构数组时,对齐才会成为一个问题。确实,对齐问题可能会导致填充,
结构的单个成员元素之间的填充,以提供后者的正确对齐。不,(在C语言中,根据标准)数组元素之间永远不会出现填充。1)数组元素不是用C语言填充的,不是由编译器填充的,也不是由链接器填充的。2) C编译器决定是否填充结构(出于什么原因,它可能认为这是必要的)。没办法。链接器将无法再执行此操作。在C语言中,
struct
的大小以及它的所有成员元素的大小和偏移量基本上需要在编译时就知道,在链接器介入之前就知道了。这是必要的,例如,为C代码大量使用的所有指针创建正确的代码。实际上,我们在C#中使用C结构,但我们没有实现它,因为我们使用它作为外部引用。那么,我们如何在不创建结构的情况下获得c#中的偏移量呢?