2015-09-18 45 views
1

我有以下代碼件Ç初始化器元件是不恆定的[這是什麼陣列和變量之間的差]

#include <stdio.h> 

int a[4]; 
int b; 
struct test { 
     int *ptr; 
     int val; 
}; 

struct test test_array[] = { 
     { 
       a, //Don't understand here 
       b //compile error 
     } 
}; 

int main() { 
     struct test ha = test_array[0]; 
     ha.ptr[0] = 10; 
     printf("%d\n", ha.ptr[0]); 
     return 0; 
} 

從下面的鏈接,我知道爲什麼編譯錯誤發生的情況。 C - initializer element is not constant

但只是不明白爲什麼靜態存儲陣列可以嗎?

由於

在C全局變量的
+0

語法問題不談,當你認爲用另一個未初始化變量的值初始化一個變量時,你在想什麼? – Lundin

+0

@Lundin我認爲這裏的來源不應該是最終版本。 –

+1

@Lundin:靜態存儲持續時間變量*總是*初始化。 –

回答

6

初始化器需要是常數表達式,和b不是一個常量表達式。 (它甚至不是一個const變量。)相比之下,表達式a是全局數組a的第一個元素的地址,並且全局變量的地址是常量表達式。

要在更高層次上回答你的問題:ab之間的區別是,你正在使用的值的b但不是a的價值,只有它地址

+0

謝謝Kerrek。非常清楚。 –

0

如前所述,b不是恆定的。至於a,變量的內容也不是常量,但是你在結構中的所有內容都是該數組的地址。這是不變的,並在編譯時知道。

+0

這個答案有點鬆散:如果你在文件範圍說'const int a = 3;',這個常量在編譯時是已知的,但[C不允許它作爲初始化器](https:// ideone的.com/jU2Xw7)。最終,答案是C就是這樣規定的,不盡如人意。它只是沒有一個非常複雜的常量表達式的概念。 –

+0

沒錯,你說得好。但你明白了。 –

+0

結果是,思考編譯器的詳細操作對於理解語言通常不是有用的......對人來說完全有意義的東西可能對C沒有意義。 –

相關問題