结构指针(地址)和默认构造函数

地衣

是否采用C#结构的地址会导致默认构造函数调用?

例如,我得到了这样的结构:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct HEADER {
    public byte OPCODE;
    public byte LENGTH;
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct S {
    public HEADER Header;
    public int Value;
}

然后,我当然不能这样做:

S s;                // no constructor call, so...
var v = s.Value;    // compiler error: use of possibly unassigned field 'Value'

但是一旦获得指向该结构的指针,即使不使用该指针,甚至嵌入式结构的字段,我都可以读取其字段:

S s;
S* ps = &s;
var v1 = ps->Value;        // OK, expected
var v2 = s.Value;          // OK!
var len = s.Header.LENGTH; // OK!

那么,它会以某种方式调用默认构造函数吗?或者-一旦我获取了地址-C#就不再关心内存了?

PS:无论如何,内存似乎都是零初始化的。

亨克·霍尔特曼

是否采用C#结构的地址会导致默认构造函数调用?

不。它只是绕过了编译器检查。

“使用可能未分配的字段”是防止您自己受到攻击的好方法。但可以轻松解决。在这种情况下,它似乎并不那么重要。

PS:无论如何,内存似乎都是零初始化的。

是的,.NET中几乎总是这样(见下文),这使“默认构造函数调用”问题变得有点学术性。您的内存发生的情况与编译器警告并不紧密相关。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章