谁能在MSVC ++ std库中解释这个超出范围的数组访问?

时间:2014-11-25 08:34:15

标签: c++ arrays visual-studio-2010 typeinfo

在type_info的Visual Studio实现中,通常位于C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ typeinfo:

class type_info {
    /* ... */

    _CRTIMP_PURE bool __CLR_OR_THIS_CALL operator==(const type_info& _Rhs) const;

    /* ... */

private:
    void *_M_data;
    char _M_d_name[1];
    __CLR_OR_THIS_CALL type_info(const type_info& _Rhs);

   /* ... */

};

我注意到等于运算符的实现==使用了字符指针_M_d_name + 1.任何人都可以向我解释这是如何工作的,因为它似乎不在数组范围内?

实现,C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ crt \ src \ ti_inst.cpp:

ASSERT_UNMANAGED_CODE_ATTRIBUTE
SECURITYSAFECRITICAL_ATTRIBUTE
bool type_info::operator==(const type_info& rhs) const
{
        return (strcmp((rhs._M_d_name)+1, (_M_d_name)+1)?0:1);
}

谢谢!

1 个答案:

答案 0 :(得分:1)

这个技巧适用于灵活的阵列成员。它将为class type_info和名称字符串分配内存,因此(rhs._M_d_name)+1正好是名称字符串所在的位置。这是一个描述它的图表:

        +------------+ --+           
        |            |   |           
        +------------+               
        |            |   |           
        |            |    ->type_info
        +------------+   |           
+-------+  _M_d_name |   |           
|       +------------+ --+           
+------->            |               
        |            |               
        |            |               
        +------------+               

实际上,c99支持此功能并a Microsoft extension allows the last member of a C or C++ structure or class to be a variable-sized array