从实验(在铛和海湾合作委员会,以-02和-O0) 似乎是在下面的代码
typedef struct foo_s { int i; int j; } foo_t;
int main(void) {
foo_t foo = {.i = 42};
...
foo.j是自动为零。
是由C99保证起,或者是一个编译器的具体实现细节?
注:我甚至试着写0xFFs无效栈下方的内存,在此foo是后来给出的地址。
更新:有一对夫妇的评论指出,这仅仅是因为在堆栈下面内存恰好包含零。 下面的代码是为了确保这不是这种情况,并且可以证明GCC -O0被归零内存。
-7和-6的偏移是编译器依赖性。 他们需要在不同锵。
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