[英]Can't we initialize automatic array variables?
我指的是Gottfried的着作“用C編程的理論和問題” (Schaum的綱要系列,第2版,1996)。 關於陣列的第9章第243頁第9.1節,它說:
與自動變量不同,自動數組無法初始化。 但是,外部和靜態數組定義可以包括如果需要的初始值的分配。
我不明白這個突出聲明的含義。 我試圖在函數內初始化數組(有和沒有auto
關鍵字),並沒有看到任何問題。
void func1 (void)
{
auto int array1[5] ={1,0,4,1,5};
charVar1='M';
printf("%d", *(array1+4));
}
回答第一部分
與自動變量不同,自動數組無法初始化
假設“自動數組”實際上是“自動存儲持續時間的數組數據結構,其長度在運行時確定”
是的,這里提到的稱為可變長度數組 。 它不能像簡單邏輯那樣初始化,大小是在運行時確定的。
引用C11
標准,章節§6.7.9, 初始化 (強調我的)
要初始化的實體的類型應為未知大小的數組或不是可變長度數組類型的完整對象類型。
否則,對於沒有任何存儲類說明符的局部變量,默認為auto
, 並且可以初始化非VLA類型的自動數組 。
鑒於這本書相當古老,沒有發明VLA和復合文字的概念。
自動變量是局部變量的正式術語。 甚至還有關鍵字auto
,但它是該語言中最多余的關鍵字之一,因為所有局部變量都隱式聲明為auto
。 那是:
{
auto int x = 1;
}
和
{
int x = 1;
}
100%相當,auto關鍵字什么都沒有(所以沒有人使用前一種風格)。
因此,通過術語自動數組,作者可能只是簡單地引用普通的本地數組。 正如我們從問題中的示例中看到的那樣,您可以很好地初始化此類數組。 這本書不正確和/或使用了錯誤的術語。
該書的作者似乎總體上感到困惑:“初始值的賦值”是初始化的C定義。 形式定義可以在6.7.8的C標准語法中找到,其中“assignment-expression”是初始化的有效形式之一。
我建議找另一本書,最好是一本涵蓋最新C標准C99和C11的書。
微不足道的證明該語句實際上是錯誤的 (而不是例如數組初始化是一種常見但非標准的擴展):
void doSomethingWithArray(size_t sz, int arr[static sz]);
int main(void) {
doSomethingWithArray(5,
(int[]){ 1, 2, 3, 4, 5 }
);
}
創建一個匿名數組,其自動存儲持續時間在main
范圍內。 由於它是匿名的,因此main
代碼無法引用它來設置元素值。 將值放入此特定自動數組的唯一方法是通過初始化。 因此,此功能 - 能夠初始化自動陣列 - 是合法,標准和必要的。
QED。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.