什么是良好的編程習(xí)慣?可以看下這段代碼,有沒有什么問題?
#include#include int main() { char*s=(char*)malloc(1024); char ch; int i = 0; while ((ch = getchar()) != ' ') { *(s + i++) = ch; } printf("%s ", s); return 0; }
代碼很簡(jiǎn)單,使用 malloc 申請(qǐng)一段堆內(nèi)存,假設(shè)內(nèi)存空間足夠大。
通過 getchar 配合 while 循環(huán),從標(biāo)準(zhǔn)輸入獲取一個(gè)字符串,直到遇到換行符結(jié)束。
最后就是把獲取的字符串輸出。
乍一看,好像程序沒什么問題。
然后把程序運(yùn)行起來,多測(cè)試幾遍,也確實(shí)沒發(fā)現(xiàn)問題。
但是如果把代碼換個(gè)平臺(tái),比如放到了 Windows 上,使用 DEV C++ 編譯器,再次運(yùn)行,程序好像出了問題。
問題就出在了 malloc 函數(shù)上面。
malloc 用于申請(qǐng)堆內(nèi)存,但是堆內(nèi)存里面的內(nèi)容是不確定的。
剛才我們用的兩個(gè)編譯器,gcc 默認(rèn)把堆內(nèi)存初始化成了 0,所以使用 getchar 獲取多個(gè)字符后,最后是 ?,是個(gè)標(biāo)準(zhǔn)的字符串。
而使用 dev C++,最后一個(gè)字符的后面并不是 ?,輸出也就出了問題。
良好的編程習(xí)慣就是使用內(nèi)存的時(shí)候盡量初始化,如果代碼這樣寫,不管移植到哪個(gè)平臺(tái),都不會(huì)出問題。
-
內(nèi)存
+關(guān)注
關(guān)注
9文章
3234瀏覽量
76508 -
編程
+關(guān)注
關(guān)注
90文章
3723瀏覽量
97434 -
代碼
+關(guān)注
關(guān)注
30文章
4976瀏覽量
74375
原文標(biāo)題:養(yǎng)成良好的編程習(xí)慣 | 堆內(nèi)存初值不一定是0
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
你的路由器信號(hào)變?nèi)蹩赡苤皇且驗(yàn)镾MA接口出現(xiàn)了氧化層
面向視覺語言導(dǎo)航的任務(wù)驅(qū)動(dòng)式地圖學(xué)習(xí)框架MapDream介紹
curl中的TFTP實(shí)現(xiàn):整數(shù)下溢導(dǎo)致堆內(nèi)存越界讀取漏洞
容易造成單片機(jī)內(nèi)存溢出的幾個(gè)陷阱介紹
C語言嵌入式系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作
如何成為編程高手
不同位數(shù)的CPU的變量所占的內(nèi)存
使用Keil MicroLIB時(shí)自動(dòng)設(shè)置堆大小
深度睡眠時(shí)為什么串口會(huì)發(fā)送一堆 \\0?
堆和棧的區(qū)別
WebGL/Canvas 內(nèi)存泄露分析
串口DMA接收方式打開,為什么在開啟IDLE中斷的情況下還需要開啟DMA中斷呢?
水泥廠堆料機(jī)與取料機(jī)無線連鎖控制解決方案實(shí)施案例
工業(yè)網(wǎng)關(guān)的內(nèi)存有什么功能
養(yǎng)成良好的編程習(xí)慣|堆內(nèi)存初值不一定是0
評(píng)論