91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++初始化的坑有哪些

發布時間:2021-11-24 10:33:54 來源:億速云 閱讀:146 作者:iii 欄目:互聯網科技

本篇內容介紹了“C++初始化的坑有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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

陷阱1:默認初始化的坑

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

int a;void func(){    int b;    static int c;    cout<<"a: "<<a<<", b :"<<b<<", c :"<<c<<endl;}int main(){    cout<<"main a: "<<a<<endl;    func();    return 0;}

打印結果是:

main a: 0a: 0, b :32694, c :0

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

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

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

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

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

但定義在函數中的變量,是在棧中分配的內存,屬于動態存儲區,此區操作系統不會幫助你清0,所以此處定義的值都是未定義的。

陷阱2:數組初始化的坑

int buff[10] = {0};for(int i = 0;i<10;i++){    cout<<buff[i]<<endl;}

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

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

int buff_2[10] = {1};for(int i = 0;i<10;i++){    cout<<buff_2[i]<<",";}

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

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

陷阱3:memset的坑

char buff[10];memset(buff,0,sizeof(buff));for(int i = 0;i<10;i++){    printf("%d ",buff[i]);}

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

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

是的,變量的類型變了,打印的結果是:

16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009

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

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

改為:

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

得到的結果是:

0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 0X1010101

是不是感覺很蹊蹺?

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

“C++初始化的坑有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

交城县| 屯昌县| 文登市| 米易县| 梨树县| 岳西县| 英吉沙县| 石柱| 长寿区| 嫩江县| 富蕴县| 宜城市| 台中市| 周口市| 阿瓦提县| 浦城县| 太白县| 泰宁县| 阿克陶县| 孝昌县| 新兴县| 泽普县| 辽阳县| 桓台县| 湘阴县| 建始县| 永安市| 阳谷县| 贵溪市| 义乌市| 明星| 蓝田县| 淮阳县| 镇江市| 安陆市| 嘉鱼县| 论坛| 仪陇县| 繁昌县| 教育| 平果县|