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 に答える