代码之家  ›  专栏  ›  技术社区  ›  Manuel Schmidt

将数组强制转换为以一个数组为成员的结构安全吗?

  •  2
  • Manuel Schmidt  · 技术社区  · 7 年前

    在以下设置中

    typedef struct {
        unsigned char data[64];
    } mystruct;
    
    int myfunc(mystruct* arg); // fills arg with data
    

    它是 安全 调用 myfunc 使用指向64字节数组的指针?例如。

    unsigned char buffer[64];
    myfunc((mystruct*) buffer)
    

    在我的具体应用程序中,我使用的是JNI direct ByteBuffer,应该从 myfunc公司 .

    unsigned char* dbbuffer = (unsigned char*) (*env)->GetDirectBufferAddress(env, jbuffer);
    

    如果演员阵容不安全,我必须创建一个 mystruct 呼叫 myfunc公司 然后 memcopy dbbuffer ,这是我想要避免的。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Marian    7 年前

    从技术上讲,它是有效的,你可以使用它。如注释所述,ANSI标准的相关部分为:

    6.7.2.1:结构和联合规范

    ... 指向 经过适当转换的结构对象指向其初始成员(或者如果该成员是 位字段,然后是它所在的单元),反之亦然。可能有未命名的 在结构对象内填充,但不在其开头填充。

    在这种情况下,严格的别名并不重要。 严格别名规则指定在何种情况下可以通过更改另一类型的值来更改某一类型的值。此规则的主要兴趣是标量类型,如 int float . 在您的特定情况下,很明显,通过更改结构的成员( unsigned char [] )你改变了整个结构,反之亦然。

    这种情况包含在严格别名规则的第5个子类别中。为了完整起见,我引用了整个部分:

    6.5表达式,第7页

    对象的存储值只能由左值表达式访问,左值表达式具有 以下类型(此列表的目的是指定对象可能具有别名或不具有别名的情况):

    –与对象的有效类型兼容的类型,

    与对象的有效类型兼容的类型的限定版本,

    一种类型,它是与的有效类型相对应的有符号或无符号类型 对象

    –一种类型,它是与 对象的有效类型,

    在其 成员(递归地包括子集合或包含的联合的成员),或

    字符类型

    其中 聚集类型 位于:

    6.2.5类型,第21页

    算术类型和指针类型统称为标量类型。阵列和 结构类型统称为聚合类型。