初學時將 '\0' 寫成 "\0",導致段錯誤(Segmentation Fault),深刻體會單雙引號差異。
for (i=0; *(p+i) != "\0"; i++) // 錯:雙引號是字符串字面量,地址非0,條件恆真
*(q+i) = *(p+i);
*(q+i) = "\0"; // 錯:賦值字符串地址給 char,截斷導致垃圾值
for (i=0; *(p+i) != '\0'; i++) // 正:單引號是字符常量,值為 0
*(q+i) = *(p+i);
*(q+i) = '\0'; // 正:賦值字符 0
| 特性 | 單引號 'x' | 雙引號 "x" |
|---|---|---|
| 類型 | int (字符常量) | char* (字符串字面量) |
| 值 | 字符編碼值 (如 'A'=65) | 字符串首地址 (含隱含 \0) |
| 長度 | 1 字符 (轉義序列算1個) | 字符數 + 1 (結束符) |
| 可修改 | 不可修改 (常量) | 不可修改 (常量區) |
訪問非法內存地址(如解引用野指針、棧溢出、寫只讀段)。本例中 *(q+i) = "\0" 將字符串地址(如 0x400123)截斷存入 char,後續作為字符串指針解引用時跳轉到隨機地址導致崩潰。
單引號存值,雙引號存址;字符用單引,字符串用雙引。