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

看板C_and_CPP作者 (沒有存在感的人)時間9年前 (2016/05/12 00:01), 9年前編輯推噓8(8019)
留言27則, 7人參與, 最新討論串1/2 (看更多)
由於板工希望十三誡能夠在教育新手的同時也能避免夾帶錯誤的觀念, 所以大膽增修已經好久沒修的十三誡。 增修的同時,板工希望能把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 -- 個人網頁:http://gnitnaw.github.io/ 以後在C_and_CPP或LinuxDev發表的文章都會放一份在這邊。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.214.44 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1462982483.A.F36.html ※ 編輯: wtchen (90.41.214.44), 05/12/2016 00:14:17

05/12 11:02, , 1F
這樣的變數會被放到BSS Section,所以如果系統初始沒有
05/12 11:02, 1F

05/12 11:02, , 2F
把BSS section清0,自然就會是亂數,寫MCU沒有OS,所以
05/12 11:02, 2F

05/12 11:04, , 3F
要靠自己把BSS section清0,Linux的話會給zero pages
05/12 11:04, 3F

05/12 11:04, , 4F
BSS是linux特有,windows沒有這個section
05/12 11:04, 4F

05/12 11:17, , 5F
因為板主拿MCU當例子,現在多數主流MCU IDE都跑ELF格式~
05/12 11:17, 5F

05/12 12:03, , 6F
有個問題,如果char str[10], 後面用了strcpy去填值
05/12 12:03, 6F

05/12 12:03, , 7F
當然我對Windows不熟,不過翻了一下PE的規格書,似乎也是
05/12 12:03, 7F

05/12 12:03, , 8F
那str有沒有事先memset有差嗎?我是會要求還是得作
05/12 12:03, 8F

05/12 12:29, , 9F
bss 在 dos 時代也有, 怎麼會是 linux 特有,
05/12 12:29, 9F

05/12 12:29, , 10F
可以反組譯看 asm 檔案, 即可確認 bss 的存在。
05/12 12:29, 10F

05/12 12:33, , 11F
dos有我倒是不知道,windows的PE沒有就是
05/12 12:33, 11F

05/12 13:24, , 12F
PE規則書,請參考 http://goo.gl/tZNC7Z
05/12 13:24, 12F

05/12 14:34, , 13F
以前怎麼試都沒有BSS section,不知道是不是編譯器問
05/12 14:34, 13F

05/12 14:34, , 14F
05/12 14:34, 14F
※ 編輯: wtchen (90.41.214.44), 05/12/2016 17:41:08

05/12 17:43, , 15F
char str 如果後面用strcpy給值那有沒設0應該沒差
05/12 17:43, 15F

05/12 17:43, , 16F
不過C99後char可以設初值不用memset
05/12 17:43, 16F

05/12 17:43, , 17F
可以順便加入不同初始的意義嗎?
05/12 17:43, 17F

05/12 17:44, , 18F
板工不清楚MCU的狀況,了解的大概就跟askcis差不多
05/12 17:44, 18F

05/12 17:44, , 19F
像是 zero, value, default 之類的?
05/12 17:44, 19F

05/12 17:47, , 20F
不同初始的意義是指?
05/12 17:47, 20F

05/12 17:47, , 21F
OS怎麼處理的嗎?那要另外寫補充資料
05/12 17:47, 21F

05/12 17:47, , 22F
板工只熟Linux....Win系列要有人寫
05/12 17:47, 22F

05/12 17:54, , 23F
像是 zero, value, default 之類的? 不懂...
05/12 17:54, 23F
※ 編輯: wtchen (86.209.153.222), 05/12/2016 19:23:11 ※ 編輯: wtchen (86.209.153.222), 05/13/2016 16:11:46

05/13 20:08, , 24F
en.cppreference.com/w/cpp/language/initialization
05/13 20:08, 24F

05/13 20:08, , 25F
johnjohnlin 講的是這裡面列的那六種吧
05/13 20:08, 25F

05/13 20:13, , 26F
這要另外寫一篇....
05/13 20:13, 26F

05/13 22:12, , 27F
板上有高手要寫嗎?我預計要寫的文章差不多快排到年底了
05/13 22:12, 27F
文章代碼(AID): #1NCrTJys (C_and_CPP)
文章代碼(AID): #1NCrTJys (C_and_CPP)