字串初始化與陣列越界問題。

2021-06-29 16:58:29 字數 1378 閱讀 1846

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非常大,那麼前兩種方式將會造成很大的開銷。所以,除非必要 即我們需...