日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++初始化的坑,你也遇到過嗎?

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

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、鄆城網(wǎng)站維護、網(wǎng)站推廣。

陷阱1:默認初始化的坑

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

 
 
 
  1. int a;
  2. void func()
  3. {
  4. int b;
  5. static int c;
  6. cout<<"a: "<
  7. }
  8. int main()
  9. {
  10. cout<<"main a: "<
  11. func();
  12. return 0;
  13. }

打印結(jié)果是:

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

可以看到,三個變量都沒有顯式初始化,但a,c都被賦予了默認值,而b是不確定的值。

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

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

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

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

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

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

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

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

答案是否定的,請看下面的這段代碼:

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

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

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

陷阱3:memset的坑

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

大家一定會覺得這段代碼很簡單,沒錯,打印結(jié)果就是都為0,的確很簡單,但是,看下接下來的代碼:

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

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

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

是不是覺得很奇怪,接下來,我們把這句:

 
 
 
  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

是不是感覺很蹊蹺?

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


當前標題:C++初始化的坑,你也遇到過嗎?
鏈接地址:http://www.dlmjj.cn/article/dhdshhe.html