數組越界真可怕,莫名就闖到了別人家
“悄悄是別離的笙簫,沉默是今晚的康橋。悄悄的我走了,正如我悄悄的來;我揮一揮衣袖,不帶走一片云彩。”情圣徐志摩的這首《再別康橋》膾炙人口,當年傳遍大江南北,撩動了無數少女的芳心。民國才女林徽因經受住了徐志摩諸多情詩的狂轟濫炸,與梁家大公子思成君喜結連理,一對金童玉女完美結合,雙雙投身建筑事業,為中國古建筑的保護和傳承留下了不可磨滅的功勛。
本文引用地址:http://www.104case.com/article/201811/395096.htm相較之下,頭頂民國四大美女之一光環的陸小曼就沒有那般矜持了,貪戀美色的志摩君在一股股不能自抑的荷爾蒙的沖擊下,將發妻、老父和家庭倫理置于腦后,將社會輿論、閑言碎語視若浮云,對國色天香的陸小曼狂轟亂炸,在那甜到心里、酥到骨里的情詩的幾番引逗之下,嫁做人婦的陸小曼出了軌,越了界,離了婚,和志摩君各取所需、“相親相愛”地結合在了一起。只是,“王子和公主并沒有永遠幸福地生活在一起”,為了滿足陸小曼紙醉金迷、驕奢淫逸的生活,徐志摩拖著腎虧的身體四處走穴講課,一代才子竟最終死于空難,客死他鄉。
不知道,這是不是“青年導師”俞敏洪先生口中所謂的“女子墮落導致家庭墮落”的經典案例呢?
看來,“越界”真的沒有好下場,破壞了兩個家庭不說,最終自己也搞到家破人亡。天圓地方、大道以常,不只是愛情、婚姻的“越界”會遭到天譴,搞嵌入式寫代碼的,遇到“數組越界”也會被搞得棲棲遑遑。
1
我一直覺得,程序員就是一個多疑到有些神經兮兮的群體,每每出了bug,便懷疑起天,懷疑起地,懷疑起賴以生存的空氣。這不,天雷君又開始作了,對著一個bug,竟然無端地懷疑起1+1不等于2起來了。
照例,灑家先不惜筆墨,把這個bug放在實際應用背景和程序中簡單描述一番。
筆者這款產品帶有遙控功能,接收到遙控器發送的遙控報文后,從中提取出相應的命令數據,根據命令執行相關操作。程序的第一步就是接收遙控報文中的數據場中的數據位流,把這些數據位按照每八位組合成一個字節的方式,提取出字節形式的數據。
通過巧妙地設計遙控報文的格式,程序可以檢測出“報文數據場”的第一個數據位,然后依序將每八個數據位存儲到一個字節形式的數組成員中,統計到固定的數據位長度后,“報文數據場”檢測結束,之后便是對數據進行解密、解析的事情了。
顯然,這里的數據位長度是8的倍數,在這個遙控報文中,數據位的個數是288,數據長度為288/8=36個字節,字節形式的數據數組定義為Rx_rawbit[36]。在程序里,數據位的長度以一個16位的變量Rf_bit_count表示,接收到一位數據位,將Rf_bit_count加一,Rf_bit_coun加到288,就說明接收完了所有的數據位。
上述Rx_rawbit數組成員為Rx_rawbit[0]- Rx_rawbit[35],數組下標從0開始,數據位的一般表示方法為0-7位,顯然,第一個數據位存放在第0個字節的第0位,第二個數據位存放在第0個字節的第1位,。。。,第九個數據位存放在第1個字節的第0位,。。。,
以此類推,第n+1個數據位存放在第(n>>3)個字節的第(n & 0x07)位。
2
正經八百的解釋到此基本結束,灑家不由得想起了《末代皇帝》里的經典畫面,三歲的溥儀被接入皇宮,舉行登基大典,小宣統被烏壓壓的場面煩躁地不行,眼看著就要大哭起來,他的父親-當時的攝政王不停地安慰他,‘快完了,快完了!’我想告訴各位看官的是,我的描述還差一點點,‘快完了!’
還記得那個“把大象放進冰箱分為幾步?”的經典笑話嗎?做為一名優秀的“嘮嗑鐘點工”,丹丹大媽給出的答案是兩步,第一步,打開冰箱,第二步,把大象放到冰箱里。雖說是典型的腦筋急轉彎,但是蘊含著深刻的智慧。
灑家借花獻佛,也把這里存放數據位的操作分為兩步。
評論