从实验(在铛和GCC,与-O2和-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
值得一提的是,在特定的情况下,OP在程序的开头只是有一个归零堆栈区域,并且它的'j'成员的值为'0'。 – 2013-02-28 14:45:33
不,即使堆栈区域未被清零,OP也有'foo_t foo = {.i = 42};'明确初始化一个成员。因此,其他成员必须初始化为0,就好像它是一个'static int j;'。 – 2013-02-28 14:52:29
@Daniel Fischer IBM说的相反吗? http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fstrin.htm“temp_address.postal_code取决于存储类temp_address变量;如果它是静态的,则该值将为NULL。“ – fadedbee 2013-02-28 15:13:26