青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

清風竹林

ぷ雪飄絳梅映殘紅
   ぷ花舞霜飛映蒼松
     ----- Do more,suffer less

Solmyr 的小品文系列之一:字符串放在哪里?

畫外音:今天是個大晴天,溫暖的陽光透過窗子照進了這間寬敞的辦公室,辦公室里三三兩兩的人們正在各自的計算機前努力工作,一切都顯得那么的安靜、祥和、有條不紊 ……

啊~!救命啊!Solmyr 你又用文件夾砸我!”

愚蠢者是應該受到懲罰的。”

畫外音: …… 呃,好吧,我得承認有點小小的例外。這里是一家軟件公司,發出慘叫的這位是 zero ,新進的大學生;這邊一臉優雅,看上去很有修養一點也不象剛剛砸過人的這位,是 Solmyr ,資深程序員,負責 zero 這一批新人的培訓。啊,故事開始了 ……

我干了什么啦?”zero 揉著鼻子問道,“這次你拿來砸我的文件夾又大了一號!”

你過來自己看看你犯下的錯誤。”Solmyr 翻出了 zero 剛剛交上來的一段代碼:

……
char* msg = “Connectting ... Please wait“
……
if( Status == S_CONNECTED )
strcpy(msg, “Connectted“);
……

我犯了什么錯誤啦?這是一個很平凡的字符串聲明而已”,zero 不滿的說到。

你看不出來嗎?connect 這個單詞的進行時和過去時你都拼錯了,多打了一個 t”Solmyr 不緊不慢地回答。

就為了這個你又用文件夾砸我 …… 啊!這次又是光盤盒!”

這是商用軟件,你以為是在 QQ 上和 PPMM 聊天,有錯別字不要緊啊?更糟糕的是,我故意留了這么長的時間給你,到現在你還沒發現你真正的錯誤在什么地方。你可真不是一般的菜啊~”,Solmyr 故意拖了個長音,滿意的看到 zero 處于爆發的邊緣,“好吧,讓我們從基礎開始,C 語言中是怎樣處理字符串的?”

這個我知道”,zero 顯得很有自信,“C/C++ 語言中,字符串是一段連續的字符型內存單元,每個單元存放一個字符,并用\0 作為結尾的標記。”

那么使用指針之前,我們應當 ……”

我們應當保證這個指針指向合法的內存,要么指向一塊已經存在的內存,要么為它動態分配一塊。”,zero 開始露出得意的笑容 —— 這種程度的問題,哈!

好!那么你的代碼中 msg 這個指針指向哪里?”

笑容凝固了。

這個 …… 呃 …… 我想 …… 它應該指向一塊合法內存,因為以前我這么做的時候,它能工作 ……”,zero 期期艾艾的說。

合法內存?這塊內存是誰分配的?它有多大?生存周期多長?有哪些特殊的性質?”

“……”

唉!”,Solmyr 重重的嘆了口氣,“我就知道會這樣。好吧,讓我們先從簡單的開始。”。Solmyr 飛快的鍵入了如下代碼:

char msg[] = “Hello“;

char* pmsg = (char*)malloc( sizeof(“Hello“) );
strcpy(pmsg, “Hello“);

上面這些代碼你應該都很清楚了:msg 是一個字符數組,C 語言保證會為它分配一段連續的內存,并將其初始化為 “Hello“ pmsg 是一個字符指針,我們調用了 malloc 函數為它動態分配了一塊內存,并用 strcpy 函數填充其值為 “Hello“ 。這兩種做法的共通點是:首先用正常手段獲得一段內存,然后填充值。接著再來看這個:”

char* msg = “Hello“;

這一句代表什么意思?首先 msg 是個指針,C/C++ 語言不負責為它分配一塊內存;其次我們也沒有顯式的為它分配一塊內存。它指向哪里?指向 “Hello“ ,就是你直接寫在代碼里的那一個。”

什么叫做‘直接寫在代碼里的那一個’?”,zero 露出了困惑的表情

舉個例子你就明白了:”,Solmyr 再鍵入:

double db = 1.5;

這 一行里面,1.5 是個什么東西?它是一個 double 類型常量,C/C++ 語言要處理它們,也要分配內存來存放這些東西。同理,當你在代碼里寫了 “Hello“ ,實際上 C/C++ 語言就分配了一塊內存存放這個字符串,當你寫 char* msg = “Hello“ 的時候,你就是把這樣一塊內存的地址賦給了指針 msg 。所以 msg 確實指向一塊合法內存,這是有時候這段代碼能夠工作的原因。但是這樣做,其中蘊涵了許多問題,我來問你,指向這塊內存的指針應該是什么類型?”

當然是 char*”zero 不加思索的回答。

錯!應該是 const char* 。想當然耳,寫在程序中的字符串你不希望它發生變化,所以很明顯的,這塊內存應該被解釋為常量。但是你在聲明 msg 的時候做了什么?”

呃 …… 我用了一個非常量的指針去指向了一個常量字符串。”,這一次,zero 明顯的審慎多了。

正確。看你原來的代碼,你不僅用一個非常量指針指向它,而且還對這個指針執行了 strcpy ,往里寫了內容。在我們的編譯器上,這么做會引發什么后果?”

呃 …… 引發一個運行時錯誤?”

部分正確。準確的講,只有在工程編譯選項為調試版本的時候,如果工程編譯選項為發布版本,一切都很正常 —— 奇怪嗎?并不,記住這一點:C/C++ 允許你打破任何保護。所以如果這兩行代碼在調試的時候沒有被發現而溜進了發布版本里”,說到這,Solmyr 狠狠的瞪了 zero 一眼,“將會是很難發現的。”

可是說來說去這么做還是沒有什么危害不是嗎?msg 指向一塊合法內存,內容正確,而且也并不是真的不能寫入,有什么好擔心的呢?”,zero 抱怨道。

Solmyr
順手抓起杯子,zero 反射性的立刻縮頭護臉。“別擔心,我只是喝水而已。”,Solmyr 面無表情 —— 如果忽略他嘴角那一絲壞笑的話 —— 的說到,“沒有危害是嗎?看看下面的代碼:”

char* str1 = “Hello“;
char* str2 = “Hello“;
*str1 = ‘P‘;
cout << str2 << endl;

猜猜運行結果是什么?”,Solmyr 一邊調整工程設置,一邊問道。

這還用問嗎?當然是輸出 Hello 了。”

回答錯誤,正確答案是 ……”,Solmyr 按下了運行按鈕,屏幕顯示的居然是 Pello !。

zero
大為詫異,撓著頭試圖找出其中的邏輯,突然間靈光一閃:“我明白了!str1 str2 實際指向同一段內存!因為 C/C++ 語言在處理 Hello 字符串的時候把它當作常量,所以就做了優化,只保存了一份 Hello !是不是這樣!”zero 興奮的轉向 Solmyr

嗯, 看起來有時候你也不是那么菜么”,Solmyr 贊許的點頭,“不過你還是說錯了一點:這個不是 C/C++ 語言的做法,是這個編譯器的做法。簡單的說,你如果要對這種字符串寫的話,其結果如何,是沒有定義的。所謂沒有定義,就是 C/C++ 語言不保證會得到怎樣的結果,可能這樣也可能樣,完全決定于你的編譯器作者怎么想。想想看吧,哪天你的程序出現了古怪的問題 —— 比如顯示信息出現了混亂 —— 起因卻是你在無關的地方寫了一個字符串,會怎樣?這是維護時最大的惡夢之一。現在你明白危害在哪里了?”

zero
有如大夢初醒一般忙不迭地點頭:“我知道了,我知道了。”

知道了還不快去改!”

……

zero
跑回坐位修改他的程序去了,辦公室里再度恢復了寧靜,所有的人都埋頭于他們的工作之中。只有 Solmyr 一邊喝著咖啡一邊揉著太陽穴,喃喃地吐出不祥的詞句:“這樣的日子才剛剛開始啊 ……”

posted on 2009-08-19 10:24 李現民 閱讀(561) 評論(0)  編輯 收藏 引用 所屬分類: 絕對盜版

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久人成影片一区二区三区观看 | 国产精品一区免费视频| 欧美伊人久久久久久久久影院| 好看的日韩视频| 久久久久欧美精品| 国产视频一区欧美| 欧美激情第六页| 亚洲欧美国产一区二区三区| 99av国产精品欲麻豆| 国产性做久久久久久| 国产精品成人免费| 欧美精品一区视频| 国产精品久久久久久亚洲调教| 国产精品亚洲不卡a| 欧美一区二区三区免费大片| 久久精选视频| 亚洲在线观看视频网站| 久久国产精品网站| 欧美aⅴ一区二区三区视频| 欧美精品www| 亚洲经典自拍| 亚洲视频在线观看视频| 国产亚洲欧美另类中文 | 欧美成人第一页| 久久国产精品99精品国产| 欧美小视频在线| 亚洲国产精品一区二区www在线| 亚洲午夜在线观看视频在线| 久久久久久69| 国产欧美一区视频| 日韩午夜黄色| 99re热这里只有精品视频| 久久全国免费视频| 国产精品自拍一区| 亚洲精品色婷婷福利天堂| 伊人久久婷婷色综合98网| 国产欧美一区二区三区在线看蜜臀| 亚洲午夜精品久久| 一区二区欧美在线| 国产精品女主播一区二区三区| 夜夜嗨一区二区| 久久久99爱| 欧美激情一区二区三区成人| 欧美极品在线播放| 亚洲尤物影院| 国产欧美日韩一区二区三区在线| 亚洲欧美日韩国产精品| 噜噜噜91成人网| 亚洲日韩中文字幕在线播放| 欧美激情在线有限公司| 国产精品资源| 亚洲视频国产视频| 一区二区国产日产| 久久免费视频网| 亚久久调教视频| 欧美激情一区二区三级高清视频 | 亚洲精品视频在线播放| 欧美日本国产精品| 蜜桃久久av| 亚洲高清资源综合久久精品| 欧美日韩三级在线| 欧美在线不卡| 国产精品久久久久9999吃药| 欧美成ee人免费视频| 国产精品乱看| 久久久青草婷婷精品综合日韩 | 欧美一级久久久久久久大片| 国产精品制服诱惑| 欧美成人一区二区在线| 国产欧美精品日韩区二区麻豆天美| 久久综合精品国产一区二区三区| 狼人天天伊人久久| 欧美日韩hd| 亚洲免费视频一区二区| 亚洲欧美日韩精品久久奇米色影视 | 亚洲成人在线视频播放| 99国产一区| 亚洲性图久久| 亚洲激情在线| 国产一区二区三区在线观看视频| 一区二区三区视频观看| 免费观看亚洲视频大全| 国产一区二区三区久久久| 欧美一区网站| 欧美成人在线网站| 亚洲欧美在线高清| 国产精品一区二区久久精品| 亚欧美中日韩视频| 一区二区三区中文在线观看 | 久久精品国产第一区二区三区| 亚洲视频免费| 女人天堂亚洲aⅴ在线观看| 亚洲电影在线免费观看| 亚洲资源av| 亚洲欧美成人综合| 亚洲一区二区av电影| 久久精品国产成人| 国产女主播一区二区三区| 欧美成人按摩| 老色批av在线精品| 久久中文在线| 另类av一区二区| 国产一区二区三区黄视频| 国产一区二区欧美| 久久激情婷婷| 亚洲欧美视频一区| 久久久久一区二区三区| 久久国产精品电影| 欧美日韩国产专区| 久久免费少妇高潮久久精品99| 欧美伊人久久久久久午夜久久久久| 一本色道久久综合狠狠躁篇怎么玩| 99re在线精品| 午夜欧美不卡精品aaaaa| 欧美日韩一区在线观看| 在线精品福利| 国产精品狼人久久影院观看方式| 国产精品久久777777毛茸茸| 国产亚洲精品美女| 亚洲午夜免费视频| 亚洲国产精品久久久久秋霞蜜臀| 久久久免费av| 免费观看在线综合| 国产精品久久久久久久午夜片| 久久爱另类一区二区小说| 亚洲成人在线视频网站| 亚洲天堂第二页| 麻豆久久婷婷| 亚洲一区二区伦理| 欧美xxx在线观看| 亚洲欧美日韩专区| 欧美日韩精品一本二本三本| 国产精品久久999| 亚洲免费成人av| 日韩一二在线观看| 国产在线麻豆精品观看| 欧美日韩一区二区三区四区在线观看| 国产伦精品一区二区三区| 亚洲图片欧洲图片av| 亚洲欧美福利一区二区| 国产日韩欧美中文在线播放| 麻豆精品在线视频| 欧美日韩在线精品| 亚洲精品在线免费| 99ri日韩精品视频| 国产一区二区在线观看免费| 久久精品人人做人人爽| 欧美日韩国产综合一区二区| 欧美一级精品大片| 欧美剧在线免费观看网站| 国产亚洲欧美一区二区| 亚洲精品女人| 国产精品久久7| 亚洲国产欧美一区二区三区久久 | 欧美中文在线字幕| 一区二区电影免费观看| 国产精品男女猛烈高潮激情| 久久精品国产欧美激情| 亚洲欧美日韩在线高清直播| 99精品福利视频| 亚洲一品av免费观看| 狠狠久久亚洲欧美| 亚洲欧美日韩国产一区二区三区| 在线观看欧美日韩| 亚洲一区二区毛片| 在线亚洲+欧美+日本专区| 在线日韩电影| 美女网站久久| 亚洲精品女人| 欧美人交a欧美精品| 免费在线成人| 亚洲国产一区二区三区青草影视| 亚洲欧美综合v| 一区二区三区高清视频在线观看 | 亚洲欧洲一区二区天堂久久| 国产精品一区久久| 日韩天堂在线观看| 亚洲视频久久| 欧美色一级片| 99在线热播精品免费| 久久精品国产第一区二区三区| 国产精品一卡二| 亚洲精品综合在线| 久久av红桃一区二区小说| 红桃视频国产一区| 欧美天天在线| 亚洲桃花岛网站| 老牛嫩草一区二区三区日本| 99一区二区| 欧美日韩亚洲一区二区三区在线| 一区二区av| 免费观看成人| 久久久中精品2020中文| 亚洲精品在线看| 国产精品入口| 欧美成人精品h版在线观看| 亚洲综合社区| 久久九九免费视频| 亚洲一区二区在线观看视频| 好看的av在线不卡观看|