十三誡增修--01:你不可以使用尚未給予適當初值的變數

作者: wtchen (沒有存在感的人)   2016-05-12 00:01:20
由於板工希望十三誡能夠在教育新手的同時也能避免夾帶錯誤的觀念,
所以大膽增修已經好久沒修的十三誡。
增修的同時,板工希望能把C99/C11/C++11/C++14的一些觀念也附上去。
例如for loop改用C99可以支援的語法 for (int a = ...){}
(畢竟現在都2016了,不能老是用ANSI C)
希望各位板友能夠踴躍提供增修意見,感謝。
PS: 不要忘記我們還有徵文活動喔 *_<
=============================================================
01. 你不可以使用尚未給予適當初值的變數
錯誤例子:
int accumulate(int max) /* 從 1 累加到 max,傳回結果 */
{
int sum; /* 未給予初值的區域變數,其內容值是垃圾 */
for (int num = 1; num <= max; num++) { sum += num; }
return sum;
}
正確例子:
int accumulate(int max)
{
int sum = 0; /* 正確的賦予適當的初值 */
for (int num = 1; num <= max; num++) { sum += num; }
return sum;
}
備註:
根據C Standard,擁有static storage duration的變數,
例如全域變數(global variable)或帶有static修飾字者,
其初值(宣告的時候若是沒有另外設初值的情況)為定值(最自然的初值就是0)。
(但是有些MCU 編譯器可能不理會這個規定,所以還是請養成設定初值的好習慣)
補充資料:
- 精華區z->5->1->1->1
- C11 Standard 5.1.2, 6.2.4, 6.7.9
作者: askacis (ASKA)   2016-05-12 11:02:00
這樣的變數會被放到BSS Section,所以如果系統初始沒有把BSS section清0,自然就會是亂數,寫MCU沒有OS,所以要靠自己把BSS section清0,Linux的話會給zero pages
作者: loveflames (咕啾咕啾魔法陣)   2016-05-12 11:04:00
BSS是linux特有,windows沒有這個section
作者: askacis (ASKA)   2016-05-12 11:17:00
因為板主拿MCU當例子,現在多數主流MCU IDE都跑ELF格式~
作者: HolyBugTw (HolyBug)   2016-05-12 12:03:00
有個問題,如果char str[10], 後面用了strcpy去填值
作者: askacis (ASKA)   2016-05-12 12:03:00
當然我對Windows不熟,不過翻了一下PE的規格書,似乎也是
作者: descent (「雄辯是銀,沉默是金」)   2016-05-12 12:29:00
bss 在 dos 時代也有, 怎麼會是 linux 特有,可以反組譯看 asm 檔案, 即可確認 bss 的存在。
作者: loveflames (咕啾咕啾魔法陣)   2016-05-12 12:33:00
dos有我倒是不知道,windows的PE沒有就是
作者: askacis (ASKA)   2016-05-12 13:24:00
PE規則書,請參考 http://goo.gl/tZNC7Z
作者: loveflames (咕啾咕啾魔法陣)   2016-05-12 14:34:00
以前怎麼試都沒有BSS section,不知道是不是編譯器問題
作者: wtchen (沒有存在感的人)   2016-05-12 17:43:00
char str 如果後面用strcpy給值那有沒設0應該沒差不過C99後char可以設初值不用memset
作者: johnjohnlin (嗯?)   2016-05-12 17:43:00
可以順便加入不同初始的意義嗎?
作者: wtchen (沒有存在感的人)   2016-05-12 17:44:00
板工不清楚MCU的狀況,了解的大概就跟askcis差不多
作者: johnjohnlin (嗯?)   2016-05-12 17:44:00
像是 zero, value, default 之類的?
作者: wtchen (沒有存在感的人)   2016-05-12 17:47:00
不同初始的意義是指?OS怎麼處理的嗎?那要另外寫補充資料板工只熟Linux....Win系列要有人寫像是 zero, value, default 之類的? 不懂...
作者: LPH66 (-6.2598534e+18f)   2016-05-13 20:08:00
en.cppreference.com/w/cpp/language/initializationjohnjohnlin 講的是這裡面列的那六種吧
作者: wtchen (沒有存在感的人)   2016-05-13 20:13:00
這要另外寫一篇....板上有高手要寫嗎?我預計要寫的文章差不多快排到年底了

Links booklink

Contact Us: admin [ a t ] ucptt.com