成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++ 初始化的坑,你也遇到過(guò)嗎?

新聞 前端
談及 C++ 的初始化,我們都知道要在變量定義的時(shí)候給它賦初值。確實(shí),在每次定義的時(shí)候就初始化不僅可以避免臟數(shù)據(jù)產(chǎn)生,還能增加代碼的可讀性。

 談及 C++ 的初始化,我們都知道要在變量定義的時(shí)候給它賦初值。確實(shí),在每次定義的時(shí)候就初始化不僅可以避免臟數(shù)據(jù)產(chǎn)生,還能增加代碼的可讀性。但是,你知道這其中有多少陷阱嗎?

[[345626]]

陷阱1:默認(rèn)初始化的坑

請(qǐng)看一下代碼,你能知道哪些變量的值是確定的?

  1. int a; 
  2.  
  3. void func() 
  4.  
  5.  
  6. int b; 
  7.  
  8. static int c; 
  9.  
  10. cout<<"a: "<<a<<", b :"<<b<<", c :"<<c<<endl; 
  11.  
  12.  
  13. int main() 
  14.  
  15.  
  16. cout<<"main a: "<<a<<endl; 
  17.  
  18. func(); 
  19.  
  20. return 0
  21.  

打印結(jié)果是:

  1. main a: 0 
  2.  
  3. a: 0, b :32694, c :0 

可以看到,三個(gè)變量都沒(méi)有顯式初始化,但a,c都被賦予了默認(rèn)值,而b是不確定的值。

其實(shí)我們可以從《C++Primer》中找到答案:“定義于任何函數(shù)體之外的變量被初始化為0,定義于函數(shù)體內(nèi)部的內(nèi)置類型變量將不被初始化”。所謂定義于函數(shù)體之外的變量,其實(shí)就是全局變量,這里拓展說(shuō)一下:

初始化過(guò)的全局變量,由編譯器將其保存于靜態(tài)存儲(chǔ)區(qū)的data段,并且這樣的值越多,程序就越大,操作系統(tǒng)會(huì)在程序啟動(dòng)時(shí),將全局變量的值復(fù)制到data段中,即完成變量的初始化。

未初始化的全局變量,由編譯器保存于靜態(tài)存儲(chǔ)區(qū)的bss段,并且這樣的值不會(huì)被使程序變大,操作系統(tǒng)加載程序時(shí)才分配相應(yīng)的內(nèi)存,并將bass段清0,即完成變量的初始化。

所以,定義在函數(shù)體之外的變量,會(huì)被賦默認(rèn)值。

但定義在函數(shù)中的變量,是在棧中分配的內(nèi)存,屬于動(dòng)態(tài)存儲(chǔ)區(qū),此區(qū)操作系統(tǒng)不會(huì)幫助你清0,所以此處定義的值都是未定義的。

陷阱2:數(shù)組初始化的坑

  1. int buff[10] = {0}; 
  2.  
  3. for(int i = 0;i<10;i++) 
  4.  
  5.  
  6. cout<<buff[i]<<endl; 
  7.  

這段代碼相信大家平時(shí)常寫,答案很明顯,都是0,但實(shí)際的原因,真的是因?yàn)閧0}代表要將每個(gè)值設(shè)為0嗎?

答案是否定的,請(qǐng)看下面的這段代碼:

  1. int buff_2[10] = {1}; 
  2.  
  3. for(int i = 0;i<10;i++) 
  4.  
  5.  
  6. cout<<buff_2[i]<<","
  7.  

得到的答案是:1,0,0,0,0,0,0,0,0,0,大家注意到了嗎?只有第一個(gè)值才是1,后面的全是0!

所以,這個(gè)坑其實(shí)是C++初始化列表的坑,初始化列表的定義中說(shuō)明,如果初始化列表的數(shù)量比定義的數(shù)量少,那么未被定義到的值將會(huì)被賦予默認(rèn)值!

陷阱3:memset的坑

  1. char buff[10]; 
  2.  
  3. memset(buff,0,sizeof(buff)); 
  4.  
  5. for(int i = 0;i<10;i++) 
  6.  
  7.  
  8. printf("%d ",buff[i]); 
  9.  

大家一定會(huì)覺(jué)得這段代碼很簡(jiǎn)單,沒(méi)錯(cuò),打印結(jié)果就是都為0,的確很簡(jiǎn)單,但是,看下接下來(lái)的代碼:

  1. int buff_2[10]; 
  2.  
  3. memset(buff_2,1,sizeof(buff_2)); 
  4.  
  5. for(int i = 0;i<10;i++) 
  6.  
  7.  
  8. printf("%d ",buff_2[i]); 
  9.  

是的,變量的類型變了,打印的結(jié)果是:

  1. 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 

是不是覺(jué)得很奇怪,接下來(lái),我們把這句:

  1. printf("%d ",buff_2[i]); 

改為:

  1. printf("0X%x ",buff_2[i]); 

得到的結(jié)果是:

  1. 0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 

是不是感覺(jué)很蹊蹺?

首先,在我的設(shè)備上,int是4字節(jié),所以buff_2總共40字節(jié),memset會(huì)對(duì)40個(gè)1字節(jié)賦值0X01,而不是對(duì)10個(gè)4字節(jié)賦值0X01。所以不要用memset對(duì)非字符型數(shù)組賦初值!

 

責(zé)任編輯:張燕妮 來(lái)源: CPP開(kāi)發(fā)者
相關(guān)推薦

2020-11-08 14:38:35

JavaScript代碼開(kāi)發(fā)

2021-08-29 18:36:17

MySQL技術(shù)面試題

2009-07-23 15:07:32

2017-07-14 09:29:45

AndroidWebview

2011-04-26 09:22:05

SQLite

2019-10-28 14:07:29

研發(fā)管理技術(shù)

2021-04-04 22:31:26

白帽子廠商漏洞

2018-04-25 10:57:00

AIX報(bào)錯(cuò)vios

2023-03-13 07:41:34

分頁(yè)查詢數(shù)據(jù)排序

2021-05-27 09:27:35

開(kāi)發(fā)技能緩存

2024-03-13 08:52:43

C++初始化方式

2020-09-24 10:49:09

iOSiPadOSBug

2023-11-12 23:08:17

C++初始化

2019-12-05 08:44:20

MybatisSQL場(chǎng)景

2022-10-20 18:00:59

OCP模型參數(shù)

2024-03-18 08:14:07

SpringDAOAppConfig

2021-12-26 14:32:11

緩存數(shù)據(jù)庫(kù)數(shù)據(jù)

2017-09-07 15:23:21

神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)網(wǎng)絡(luò)

2011-06-09 14:13:06

C++JAVA缺省初始化

2021-02-19 11:01:46

異步競(jìng)態(tài)接口異步
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 天天操天天玩 | 欧美一区二区在线观看 | 在线婷婷 | 97久久精品午夜一区二区 | 亚洲伦理自拍 | 黄网站涩免费蜜桃网站 | 欧美11一13sex性hd | 国产色网| 中文字幕日韩欧美一区二区三区 | 一级黄色片一级黄色片 | 91久久久久 | 男人的天堂中文字幕 | 久久国产精品视频观看 | 精品乱子伦一区二区三区 | 精品成人在线 | 成人三级网址 | 久久lu| www.日日干 | 国产一区91精品张津瑜 | 久久久久一区 | 一区二区三区成人 | 手机av在线 | 亚洲国产一 | 韩日一区 | 玖操| 午夜av电影 | 国产视频1区 | 97日韩精品| 99精品视频在线观看免费播放 | 久久久久亚洲精品国产 | 欧洲在线视频 | 国产精品黄色 | m豆传媒在线链接观看 | 亚洲成人一级片 | 日韩精品在线观看免费 | 午夜成人在线视频 | 99视频网站 | 久久高清 | 欧美成人一区二区三区 | 国产精久久久久久 | 男女国产网站 |