摘要:注意點這個代碼是嚴格依賴環(huán)境的,例如中和是連續(xù)的,在編譯器中,和之間有一個空間。注意點當把與交換之后,程序?qū)⒉粫霈F(xiàn)死循環(huán),但是程序的越界訪問報錯是少不了的。注意點這種優(yōu)化是無差別的,即無論你的代碼是否越界,都會進行這樣的優(yōu)化。
目錄
今天的題,并非是完全出自于nice的筆試原題,今天的這道題出自于《C陷阱和缺陷》,只是兩道題有異曲同工之妙!
#include
int main(){ int i = 0; int arr[10] = { 0 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe/n"); } return 0;}
問題:這段代碼在vs2019上會出現(xiàn)什么現(xiàn)象?這種現(xiàn)象是由什么原因造成的?我們應(yīng)該如何避免像這樣的問題?
運行結(jié)果:
出現(xiàn)了死循環(huán),即在屏幕上不停的打印"hehe"。
題目解析:
(1)i和arr是局部變量,放在棧區(qū)上
(2)棧區(qū)上的使用習(xí)慣:先使用高地址處的空間,再使用低地址處的空間
(3)數(shù)組隨著下標的增長,地址是由低到高變化的
由這三點可以畫出這段程序的內(nèi)存圖來,當然,這還要區(qū)分具體的編譯器!
結(jié)論1:
arr[12]與變量i占用的是同一塊空間,即地址值一樣?
如果arr和i之間的空間合適的話,就有可能使用的arr數(shù)組向后越界訪問到了i,造成循環(huán)變量i的改變,最終死循環(huán)。
注意點1:
這個代碼是嚴格依賴環(huán)境的,例如vc 6.0 中i和arr是連續(xù)的,在gcc編譯器中,i和arr之間有一個空間。
注意點2:
雖然此程序越界訪問了,但是由于程序進入了死循環(huán),所以不會報錯,但是一旦把i<=12改成了i<=11,程序就會在i=11的地方會停止下來,此時已經(jīng)構(gòu)成了越界訪問,程序自然會報錯。如下圖所示:
?結(jié)論2:
死循環(huán)會掩蓋程序中的某些錯誤,比如數(shù)組越界訪問。
?注意點3:
當把int i = 0;與int arr[10] = {0};交換之后,程序?qū)⒉粫霈F(xiàn)死循環(huán),但是程序的越界訪問報錯是少不了的。
注意點4:
此時也應(yīng)該注意一下debug與release版本的區(qū)別:
很明顯,在debug版本下,i的地址值比arr[9]的要大,而在release版本下,i的地址要比arr[9]的地址值要小,在release版本下進行了某些優(yōu)化,即杜絕了我們上述出現(xiàn)的死循環(huán)的情況,在這種情況下,即使數(shù)組越界,也不會影響到i的值。
注意點5:
這種優(yōu)化是無差別的,即無論你的代碼是否越界,都會進行這樣的優(yōu)化。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/124782.html
摘要:月初,那時候人還在百度北京實習(xí),當時參加了騰訊網(wǎng)易的校招內(nèi)推,結(jié)果有點呵呵。月份開始一直到月底,內(nèi)推正式校招,前后三個月時間拿到今日頭條融鏈家網(wǎng)的測試開發(fā)崗位。 引言 本人武漢大學(xué)碩士研究生三年級在讀,90后。由于2017年6月要畢業(yè),于是乎參加了2016年的秋招。8月初,那時候人還在百度(北京)實習(xí),當時參加了騰訊、網(wǎng)易的校招(內(nèi)推),結(jié)果有點呵呵。8月份開始一直到10月底,內(nèi)推+正...
摘要:順便一說,這首歌的原唱是秋田,中島當年嗓子壞了,才有這歌。中文是直接翻譯來的,作曲是秋田。一部電影春夏秋冬又一春春夏秋冬又一春是由金基德執(zhí)導(dǎo),金英民吳英秀金基德主演的一部韓國電影。年月日于韓國上映。 原鏈接: http://bluezhan.me/weekly/#/9-2 1、web前端 Angular vs. React vs. Vue: A 2017 comparison 9 S...
摘要:順便一說,這首歌的原唱是秋田,中島當年嗓子壞了,才有這歌。中文是直接翻譯來的,作曲是秋田。一部電影春夏秋冬又一春春夏秋冬又一春是由金基德執(zhí)導(dǎo),金英民吳英秀金基德主演的一部韓國電影。年月日于韓國上映。 原鏈接: http://bluezhan.me/weekly/#/9-2 1、web前端 Angular vs. React vs. Vue: A 2017 comparison 9 S...
摘要:對象是一個返回值的代理,這個返回值在對象創(chuàng)建時未必已知。這使得異步方法可以像同步方法那樣返回值異步方法會返回一個包含了原返回值的對象來替代原返回值。 前言 近來參加校招筆試,發(fā)現(xiàn)有好幾道關(guān)于Promise的題目。然而我都沒有了解過。所以,這篇文章以網(wǎng)易筆試的一道題開始,記錄關(guān)于Promise的那些事。文章地址:http://lsxj615.com/2016/08/04... 筆試題 c...
閱讀 961·2021-11-24 09:39
閱讀 3383·2021-10-27 14:20
閱讀 2322·2019-08-30 14:08
閱讀 3360·2019-08-29 16:34
閱讀 2175·2019-08-26 12:14
閱讀 2104·2019-08-26 11:54
閱讀 2771·2019-08-26 11:44
閱讀 2474·2019-08-26 11:38