1

那可能吗?如果有人可以指导我在标准中提到的位置,我会很高兴。

对我来说,它按我期望的那样工作,使用MinGW. 但是,我想知道这是否是标准的。这是我测试的代码:

#include <stdio.h>

int main(void) {

    int me[3][2] = {{1, 2}, 3, 4, 5, 6};
    int x = 0;

    while(x<6) printf("%d_", ((int*)me)[x]), ++x;

    return 0;

}

输出是:1_2_3_4_5_6_

4

2 回答 2

3

那可能吗?如果有人可以指导我在标准中提到的位置,我会很高兴。

认为这是标准的,但我不会说我有明确的证据。

6.7.9

如果聚合或联合包含属于聚合或联合的元素或成员,则这些规则递归地应用于子聚合或包含的联合。如果子聚合或包含联合的初始化程序以左大括号开头,则由该大括号及其匹配的右大括号括起来的初始化程序初始化子聚合或包含联合的元素或成员。否则,仅从列表中获取足够多的初始化器来考虑子聚合的元素或成员或包含的联合的第一个成员;剩下的任何初始化器都将用于初始化当前子聚合或包含的联合所属的聚合的下一个元素或成员。

后来,虽然不是专门针对数组,但它给出了一个括号不一致的初始化示例:

struct { int a[3], b; } w[] = { { 1 }, 2 };

w[0].a[0]是 1 和w[1].a[0]2;所有其他元素都为零

于 2012-08-13T11:14:28.077 回答
2

至于初始化程序,是的,这是标准的。

至于印刷。嗯,这更复杂。内存保证是连续的,但编译器实际上可以在那条线上触发 UB(但我真的不认为你会找到一个这样做的)。

于 2012-08-13T11:09:45.747 回答