基礎知識 | 每日一面(10)

  • 2019 年 12 月 19 日
  • 筆記

古代的劍客們與

對手相逢時,無

論對手多麼強大,

明知不敵,也要亮出自己的劍!

讀者:為什麼程式碼 int f() { char a[] = "Hello, world!";} 不能編譯?

小林:可能你使用的是 ANSI 之前的編譯器, 還不支援 「自動聚集」(automatic aggre-gates, 即非靜態局部數組、結構和聯合) 的初始化。

讀者:這樣的初始化有什麼問題?char *p = malloc(10); 編譯器提示「非法初始式」 。

小林:這個聲明是靜態或非局部變數嗎?函數調用只能出現在自動變數 (即局部非靜態變數) 的初始式中。

讀者:以下的初始化有什麼區別?char a[] = "string literal"; char *p= "string literal"; 當我向 p[i] 賦值的時候, 我的程式出錯了。

小林:字元串常量有兩種稍有區別的用法。用作數組初始值, 它指明該數組中字元的初始值。其它情況下, 它會轉化為一個無名的靜態字元數組, 可能會存儲在只讀記憶體中, 這就是造成它不一定能被修改。在表達式環境中, 數組通常被立即轉化為一個指針, 因此第二個聲明把 p 初始化成指向無名數組的第一個元素。為了編譯舊程式碼, 有的編譯器有一個控制字元串是否可寫的開關。

有時候,正是那些意想不到之人,成就了無人能成之事。

——圖靈