基礎知識 | 每日一面(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 初始化成指向無名數組的第一個元素。為了編譯舊程式碼, 有的編譯器有一個控制字元串是否可寫的開關。
有時候,正是那些意想不到之人,成就了無人能成之事。
——圖靈