実験 (Clang および GCC で、-O2 および -O0 を使用)から、次のコードでは
typedef struct foo_s { int i; int j; } foo_t;
int main(void) {
foo_t foo = {.i = 42};
...
foo.j は自動的にゼロになります。
C99以降で保証されていますか、それともコンパイラ固有の実装の詳細ですか?
注:スタックの下の無効なメモリに、foo が後で指定されるアドレスに 0xFF を書き込もうとさえしました。
更新: これは、スタックの下のメモリにたまたまゼロが含まれているためであるというコメントがいくつかあります。次のコードは、これが当てはまらないことを確認し、GCC -O0 がメモリをゼロにしていることを証明する可能性があります。
-7 と -6 のオフセットは、コンパイラに依存します。それらは Clang で異なる必要がありました。
typedef struct foo_s { int i; int j; } foo_t;
int main(void) {
int r;
int *badstack0 = &r - 7;
int *badstack1 = &r - 6;
*badstack0 = 0xFF; // write to invalid ram, below stack
printf("badstack0 %p, val: %2X\n", badstack0, *badstack0);
*badstack1 = 0xEE; // write to invalid ram, below stack
printf("badstack1 %p, val: %2X\n", badstack1, *badstack1);
// struct test
foo_t foo = {.i = 42};
printf("&foo.i %p\n", &foo.i);
printf("&foo.j %p\n", &foo.j);
printf("struct test: i:%i j:%i\n", foo.i, foo.j);
return 0;
}
出力:
badstack0 0x7fff221e2e80, val: FF
badstack1 0x7fff221e2e84, val: EE
&foo.i 0x7fff221e2e80
&foo.j 0x7fff221e2e84
struct test: i:42 j:0