C语言的数组初始化「建议收藏」
這是很基礎(chǔ)的東西,但基礎(chǔ)的重要性不言而喻,我敢肯定這個知識點我肯定曾經(jīng)了解過,但現(xiàn)在,我不敢確定,由此可見紀(jì)錄的重要性,這世界沒有什么捷徑,找對方向,然后不停重復(fù).所以從今天開始,我會比較詳細(xì)的紀(jì)錄這些比較小的知識點,其實還是有不少有意思的地方的.
寫這篇文章的起因在于<<COM技術(shù)內(nèi)幕>>第七章新東西太多,看的我目不暇接,所以在網(wǎng)上找了些例子看,其中就有一個例子中出現(xiàn)了這樣的語句:
…
wchar_twname[
128
]
=
…
{
0}
;
char
cname[
256
]
=
…
{
0}
;
…
我感興趣的是:
1.這種賦值的結(jié)果.
2.這種形式是否符合標(biāo)準(zhǔn)編碼規(guī)則?
我找到了如下資料,可能有助于對這個知識點的掌握.
/**/
/*
初始化值的個數(shù)可少于數(shù)組元素個數(shù).當(dāng)初始化值的個數(shù)少于數(shù)組元素個數(shù)時,前面的按序初始化相應(yīng)值,后面的初始化為0(全局或靜態(tài)數(shù)組)或為不確定值(局部數(shù)組).
*/
我相信上面的資料是C和C++語言的標(biāo)準(zhǔn)規(guī)范,但實際編譯器處理時,可能會和規(guī)范有所不同.因為編譯器原則上要遵從語言規(guī)范,但對于局部數(shù)組的不確定值到底是多少,怎么處理,編譯器就可以靈活處理.我測試了三種編譯器,其實編譯器賦予的值是固定的,都是0.
在這篇blog中 http://hi.baidu.com/widebright/blog/item/a024bc09631402256b60fbd0.html 談?wù)摿讼嗤脑掝},現(xiàn)對其摘錄如下:
/**/
/*
一直以為inta[256]={0};是把a的所有元素初始化為0,inta[256]={1};是把a所有的元素初始化為1.
調(diào)試的時查看內(nèi)存發(fā)現(xiàn)不是那么一回事,翻了一下《TheC++ProgrammingLanguage》總算有定論。PDF的竟然不然復(fù)制,就把它這章翻譯了,如下
5.2.1數(shù)組初始化
數(shù)組可以用一個列值來初始化,例如
intv1[]={1,2,3,4};
charv2[]={‘a’,’b’,’c’,0};
當(dāng)數(shù)組定義時沒有指定大小,當(dāng)初始化采用列表初始化了,那么數(shù)組的大小由初始化時列表元素個數(shù)決定。所以v1和v2分別為int[4]和char[4]類型。如果明確指定了數(shù)組大小,當(dāng)在初始化時指定的元素個數(shù)超過這個大小就會產(chǎn)生錯誤。例如:
charv3[2]={‘a’,’b’,0};//錯誤:太多的初始化值了
charv3[3]={‘a’,’b’,0};//正確
如果初始化時指定的的元素個數(shù)比數(shù)組大小少,剩下的元素都回被初始化為0。例如
intv5[8]={1,2,3,4};
等價于
intv5[8]={1,2,3,4,0,0,0,0};
注意沒有如下形式的數(shù)組賦值:
voidf()
{
v4={‘c’,’d’,0};//錯誤:不是數(shù)組賦值
}
如果你想這樣的復(fù)制的話,請使用vector(16章第三節(jié))或者valarray(22章第四節(jié))。
字符數(shù)組可以方便地采用字符串直接初始化(參考第五章2.2小節(jié))
譯注:就是這樣啦charalpha[]=”abcdefghijklmn”;
*/
下面來看一個例子:
#include
<
iostream.h
>
int
array1[
5
]
=
…
{
1,2,3}
;
static
int
array2[
5
]
=
…
{
1}
;
void
main()
…
{
intarr1[5]=…{
2};
staticintarr2[5]=…{
1,2};
intn;
cout<<“global: “;
for(n=0;n<5;n++)
cout<<““<<array1[n];
cout<<“ globalstatic: “;
for(n=0;n<5;n++)
cout<<““<<array2[n];
cout<<“ local: “;
for(n=0;n<5;n++)
cout<<““<<arr1[n];
cout<<“ localstatic: “;
for(n=0;n<5;n++)
cout<<““<<arr2[n];
cout<<endl;
}
在這個例子中,全局和靜態(tài)數(shù)組都按語言規(guī)范要求被初始化為0,但是局部數(shù)組并沒有向前面所說的為不確定值,下面是用gcc,VC6.0,tuborC++分別編譯的結(jié)果(注意gcc用g++編譯c++文件,gcc不會鏈接庫的):
/**/
/*
GCC可同時用來編譯C程序和C++程序。一般來說,C編譯器通過源文件的后綴名來判斷是C程序還是C++程序。在Linux中,C源文件的后綴名為.c,而C++源文件的后綴名為.C或.cpp。
但是,gcc命令只能編譯C++源文件,而不能自動和C++程序使用的庫連接。因此,通常使用g++命令來完成C++程序的編譯和連接,該程序會自動調(diào)用gcc實現(xiàn)編譯。
*/
GCC:
VC6.0:
TurboC++
這說明了對局部數(shù)組沒有初始化的元素的值,這幾種編譯器都將其設(shè)置為0.但是,如果如果不對數(shù)組進(jìn)行初始化,即在定義的同時沒有用列表初始化,那么局部數(shù)組的值就取決于編譯器而對程序員來說就是不可預(yù)料的了.有時間可以測試一下各個編譯器,不過在vc中是0xcc.所以對局部數(shù)組的初始化要特別小心.但是全局的數(shù)組和靜態(tài)數(shù)組還是會被正確的賦于0值的.
最后要重申下對變量初始化的重要性,http://blog.vckbase.com/smileonce/archive/2005/06/18/6777.html 這里列舉了沒有初始化造成的事故.
此外,這個blog地址值得收藏,在http://blog.vckbase.com/排行榜的blog都值得仔細(xì)看.
在VC的安裝盤的/VC98/CRT下可以看到vc自帶的C/C++庫的源代碼.
總結(jié)
以上是生活随笔為你收集整理的C语言的数组初始化「建议收藏」的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [蓝桥杯]算法提高 金属采集(树形dp)
- 下一篇: mavlink协议解析_jlink 串口