從實驗(在鐺和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