C 数组初始化
??? 寫這篇文章的起因在于<<COM技術內幕>>第七章新東西太多,看的我目不暇接,所以在網上找了些例子看,其中就有一個例子中出現了這樣的語句:?
wchar_t?wname[128]={0};
char?cname[256]={0};
...
我感興趣的是:
1.這種賦值的結果.
2.這種形式是否符合標準編碼規則?
我找到了如下資料,可能有助于對這個知識點的掌握.
/*初始化值的個數可少于數組元素個數.當初始化值的個數少于數組元素個數時,前面的按序初始化相應值,?后面的初始化為0(全局或靜態數組)或為不確定值(局部數組).
*/
?
我相信上面的資料是C和C++語言的標準規范,但實際編譯器處理時,可能會和規范有所不同.因為編譯器原則上要遵從語言規范,但對于局部數組的不確定值到底是多少,怎么處理,編譯器就可以靈活處理.我測試了三種編譯器,其實編譯器賦予的值是固定的,都是0.
在這篇blog中 http://hi.baidu.com/widebright/blog/item/a024bc09631402256b60fbd0.html 談論了相同的話題,現對其摘錄如下:?
/*一直以為?int?a[256]={0};是把a的所有元素初始化為0,int?a[256]={1};是把a所有的元素初始化為1.
調試的時查看內存發現不是那么一回事,翻了一下《The?C++?Programming?Language》總算有定論。PDF的竟然不然復制,就把它這章翻譯了,如下
5.2.1???數組初始化?
數組可以用一個列值來初始化,例如
?????????int?v1[]?={1,2,3,4};
?????????char?v2[]={'a','b','c',0};
當數組定義時沒有指定大小,當初始化采用列表初始化了,那么數組的大小由初始化時列表元素個數決定。所以v1和v2分別為?int[4]?和char[4]類型。如果明確指定了數組大小,當在初始化時指定的元素個數超過這個大小就會產生錯誤。例如:
?????????char???v3[2]?={'a','b',0};???//錯誤:太多的初始化值了
?????????char???v3[3]?={'a','b',0};???//正確
如果初始化時指定的的元素個數比數組大小少,剩下的元素都回被初始化為???0。例如
?????????int???v5[8]={1,2,3,4};
等價于
??????????int???v5[8]={1,2,3,4,0,0,0,0};
注意沒有如下形式的數組賦值:
?????????void?f()
?????????{
?????????????v4={'c','d',0};???//錯誤:不是數組賦值
?????????}
如果你想這樣的復制的話,請使用?vector(16章第三節)?或者?valarray(22章第四節)。
????????字符數組可以方便地采用字符串直接初始化(參考第五章?2.2小節)
?????????譯注:?就是?這樣啦???char???alpha?[]="abcdefghijklmn";
*/
?
下面來看一個例子:
#include?<iostream.h>int?array1[5]={1,2,3};
static?int?array2[5]={1};
void?main()
{
????int?arr1[5]={2};
????static?int?arr2[5]={1,2};
????
????int?n;
????cout?<<"global: ";
????for(n=0;?n<5;?n++)
????????cout?<<"?"?<<array1[n];
????
????cout?<<" global?static: ";
????for(n=0;?n<5;?n++)
????????cout?<<"?"?<<array2[n];
????
????cout?<<" local: ";
????for(n=0;?n<5;?n++)
????????cout?<<"?"?<<arr1[n];
????
????cout?<<" local?static: ";
????for(n=0;?n<5;?n++)
????????cout?<<"?"?<<arr2[n];
????cout?<<endl;
}
在這個例子中,全局和靜態數組都按語言規范要求被初始化為0,但是局部數組并沒有向前面所說的為不確定值,下面是用gcc,VC6.0,tuborC++分別編譯的結果(注意gcc用g++編譯c++文件,gcc不會鏈接庫的):
/*GCC?可同時用來編譯?C?程序和?C++?程序。一般來說,C?編譯器通過源文件的后綴名來判斷是?C?程序還是?C++?程序。在?Linux?中,C?源文件的后綴名為?.c,而?C++?源文件的后綴名為?.C?或?.cpp。
????但是,gcc?命令只能編譯?C++?源文件,而不能自動和?C++?程序使用的庫連接。因此,通常使用?g++?命令來完成?C++?程序的編譯和連接,該程序會自動調用?gcc?實現編譯。
*/
?
GCC:
?
?
VC6.0:
?
TurboC++
?
?
??? 這說明了對局部數組沒有初始化的元素的值,這幾種編譯器都將其設置為0.但是,如果如果不對數組進行初始化,即在定義的同時沒有用列表初始化,那么局部數組的值就取決于編譯器而對程序員來說就是不可預料的了.有時間可以測試一下各個編譯器,不過在vc中是0xcc.所以對局部數組的初始化要特別小心.但是全局的數組和靜態數組還是會被正確的賦于0值的.
??? 最后要重申下對變量初始化的重要性,?http://blog.vckbase.com/smileonce/archive/2005/06/18/6777.html? 這里列舉了沒有初始化造成的事故.
??? 此外,這個blog地址值得收藏,在http://blog.vckbase.com/?排行榜的blog都值得仔細看.
??? 在VC的安裝盤的/VC98/CRT下可以看到vc自帶的C/C++庫的源代碼.
http://blog.csdn.net/sibylle/article/details/2026915
轉載于:https://www.cnblogs.com/yuzaipiaofei/archive/2011/07/08/4124663.html
總結
- 上一篇: Windows7是什么
- 下一篇: 读-福瑞哈哥-的POE学习笔记