string p1="abcd";
char *p2="abcd";
char p3="abcd"; //sizeof(p3)=5;
字串結尾都有系統自動補『\0』,可用作判斷字串結束標誌
字元陣列和字串最明顯的區別就是字串會被預設的加上結束符'\0'。
char p4[4]="abcd";//在定義時
系統提示字元太長編譯不通過。"abcd"長度為5
字元陣列並不要求最後乙個字元為'\0'.是否加入'\0',完全由系統需要決定。但是我們寫**時要求字元陣列初試化要求最後乙個字元必須是
'\0'
,類似char p[4]=;這樣的定義是錯誤的,雖然可以通過編譯。
但是如果定義時為 char p[5];在將5個字元複製到字元陣列中,編譯時不會出錯,但是執行時輸出結果可能會多出幾位。(遇到結束位'\0'才會停止) ,見test2()函式
----------aaaaaaaaaa記憶體分布。執行strcpy(str2,str1)在str1後面直到遇到結束符'\0'才停止複製。超出程式定義空間。
這裡最大問題是str1沒有結束符。因為strcpy的第二個引數應該是乙個字串常量(字串預設帶有結束標誌),而該函式就是利用第二個引數的結束符來判斷複製是否結束。所以在for迴圈後面加上str1[9]='\0';
在dev中上例可以執行成功。但是下例可是直接崩潰,請問為什麼?
aaaaaaaaaa---------- 和上面相同基本都會崩潰,只是各個編譯器處理方式不同而已。
答案參見 面試例二下的解釋。
總結:對字元陣列操作結尾一定要自己新增結束標誌'\0'.
字串陣列初始化
1 char arr 10 hi 初始化字串陣列時,編譯器自動將字串最後乙個字元後面加上 0 以表示字串的結束。如果陣列的大小大於字串的長度 1,那麼把字串結束後面的元素也都初始化為 0 看這段程式 定義乙個大小為12的字串陣列 char str1 12 jiajia 讓乙個char型的指標指向這個...
字串陣列初始化相關問題總結
在c語言程式設計中,當我們宣告乙個字串陣列的時候,常常需要把它初始化為空串。總結起來有以下三種方式 第 1 2 種方式是將str陣列的所有元素都初始化為 0 而第 3 種方式是只將str陣列的第乙個元素初始化為 0 如果陣列的size非常大,那麼前兩種方式將會造成很大的開銷。所以,除非必要 即我們需...
字串陣列初始化相關問題總結
在c語言程式設計中,當我們宣告乙個字串陣列的時候,常常需要把它初始化為空串。總結起來有以下三種方式 第 1 2 種方式是將str陣列的所有元素都初始化為 0 而第 3 種方式是只將str陣列的第乙個元素初始化為 0 如果陣列的size非常大,那麼前兩種方式將會造成很大的開銷。所以,除非必要 即我們需...