1、C/C++數(shù)組初始化,數(shù)組賦值
以下賦值方式是錯(cuò)誤的:
[cpp]
int a4[3] = {}; //無(wú)法通過(guò)編譯亡容;//不能分配常量大小為0的數(shù)組
char s3[3] = "abc"; //編譯錯(cuò)誤,數(shù)組越界冤今。
上一段中闺兢,第二個(gè)例子之所以錯(cuò)誤,是因?yàn)椤癮bc”是字符串有4個(gè)字符戏罢,除了a/b/c三個(gè)字符之外屋谭,還有一個(gè)結(jié)束字符 '\0' 。
摘自:
http://blog.csdn.net/maxsky/article/details/41547399
http://blog.csdn.net/lanceleng/article/details/8707745
2龟糕、c/c++數(shù)組初始化誤區(qū)
int型數(shù)組
int szTmp[256] = {0};
int szTmp2[256] = {1};
一開(kāi)始總認(rèn)為szTmp的值就全部是0桐磁,szTmp2的值全部是1。
結(jié)果打印一看讲岁,szTmp的值就全部是0我擂,但是szTmp2的第一個(gè)值是1衬以,其他的全部是0。
原因: int szTmp[256]={var}; 第一個(gè)元素是顯式地初始化為var校摩,其余元素是隱式地初始化為0看峻。
char型字符型數(shù)組
char str[10]="Hello";
char str[10]={"Hello"};
char str[10]={'H','e','l','l','o','\0'};
char str[10]={'H'};
char str[10]={0};
char str[10]="Hello, world.\n";//報(bào)錯(cuò)
char str[]="Hello, world.\n";
第一種情況:初始化數(shù)據(jù)小于數(shù)組長(zhǎng)度
如前面三個(gè)初始化的例子,這三個(gè)例子的效果一樣衙吩,前五個(gè)字符為Hello,剩余的用'\0'填充
第四行與第五行互妓,都只指定了第一個(gè)字符,剩余的全部用'\0'填充分井。第五個(gè)例子相當(dāng)將整個(gè)數(shù)組初始化為'\0'
第二種情況:初始化數(shù)據(jù)等于或超過(guò)數(shù)據(jù)長(zhǎng)度车猬,這種情況下,編譯報(bào)錯(cuò)尺锚,溢出珠闰。
第三種情況:不指定數(shù)組長(zhǎng)度
這種情況下,數(shù)組部分如果不含有明確指定的'\0'瘫辩,那么編譯時(shí)會(huì)被自動(dòng)添加一個(gè)'\0';
在數(shù)組不含有明確的'\0'時(shí)伏嗜,sizeof(str)=strlen(str)+1;
3、在這里順便再跟大家一起溫習(xí)一下數(shù)組初始化規(guī)則:
1.指定數(shù)組大小的情況下:
(1)如果初始化時(shí)指定的的元素個(gè)數(shù)比數(shù)組大小少伐厌,剩下的元素都回被初始化為0承绸。
例如 int v5[8]={1,2,3,4};等價(jià)于 int v5[8]={1,2,3,4,0,0,0,0};
(2) 如果初始化時(shí)指定的的元素個(gè)數(shù)與數(shù)組大小相等,則數(shù)組元素就按照列表初始化
例如 int v5[4]={1,2,3,4};
2.沒(méi)有指定數(shù)值大小的情況下:
當(dāng)初始化采用列表初始化了挣轨,那么數(shù)組的大小由初始化時(shí)列表元素個(gè)數(shù)決定
例如 int v5[] ={1,2,3,4}; //數(shù)值的大小為4
4军熏、int a[2];//里面的全是垃圾值
一般來(lái)說(shuō) 全局變量、靜態(tài)變量處于數(shù)據(jù)區(qū)卷扮,默認(rèn)初始化為0 (如果指定初始值荡澎,則為指定的值)。而局部變量處于棧區(qū)晤锹,其數(shù)值是隨機(jī)的摩幔,即當(dāng)時(shí)內(nèi)存中的值,全是垃圾值鞭铆。
總體來(lái)說(shuō)
不要利用編譯器的這種默認(rèn)原則或衡,
而是應(yīng)當(dāng)顯示的指定,
必要的初始化不是笨拙车遂,
而是規(guī)范封断。
參考網(wǎng)址
5、字符串和字符串結(jié)束標(biāo)志
最經(jīng)常使用的是以字符串常量的方式初始化字符數(shù)組艰额,并可以省略{}澄港。一般的字符數(shù)組和數(shù)組不省略{}。
static char c[] = "I am happy";
該字符串長(zhǎng)度為11(因字符串常量最后由系統(tǒng)自動(dòng)增加一個(gè)’\0’)
等價(jià)于
static char c[]={'I',’ ’,'a','m',‘ ','h','a','p','p','y','\0'};
字符數(shù)組并不要求它的最后一個(gè)字為‘\0’柄沮,甚至可以不包含‘\0’。以下這樣寫(xiě)完全是合法的:
static char c[5]={'C','h','i','n','a'};//合法
但這樣的字符串在printf輸出時(shí)有風(fēng)險(xiǎn):
printf(“%s”,c);//數(shù)組最后一個(gè)元素不是'\0'導(dǎo)致越界,輸出不正常燙燙
為了使字符數(shù)組與字符串常量在處理方法一致,便于測(cè)定字符序列的實(shí)際長(zhǎng)度在字符數(shù)組中也常常人為地加上一個(gè)‘\0’, 如:
static char c[6]={'C','h','i','n','a','\0'};
char *str = {"ssss"};//字符串常量*str 和str[] 所存的位置不同祖搓,另片細(xì)述
當(dāng)使用printf()輸出時(shí)狱意,格式化時(shí)選擇%s,會(huì)輸出ssss拯欧,由于printf遇到結(jié)尾符號(hào)‘\0’即停止顯示打印详囤。
字符串“ssss”是個(gè)常量,存儲(chǔ)在一片連續(xù)的內(nèi)存中镐作,末尾有結(jié)尾符表示字符串的結(jié)束藏姐。
所有的字符串常量都被放在靜態(tài)內(nèi)存區(qū)。
因?yàn)樽址A亢苌傩枰薷母眉郑旁陟o態(tài)內(nèi)存區(qū)會(huì)提高效率羔杨。
參考網(wǎng)址