字元陣列 a 容量 6 位元組,內容 "hello\0",可修改如 a[0]='X'。指標 p 指向常數字串 "world"(位於靜態儲存區),常數字串內容不可修改。語法上 p[0]='X' 編譯器不報錯,但執行期會導致錯誤(存取違規)。
char a[] = "hello";
a[0] = 'X'; // OK
cout << a << endl;
char* p = "world"; // p 指向常數字串
p[0] = 'X'; // 編譯通過,執行期崩潰!
cout << p << endl;
陣列名不可直接複製與比較。
a 複製給 b,b = a 會編譯錯誤,須用 strcpy(b, a)。if (b == a) 比較的是位址而非內容,須用 strcmp(b, a) == 0。指標同理:
p = a 是將 a 位址指派給 p,非複製內容。正確做法:malloc 配置記憶體後 strcpy(p, a)。if (p == a) 比較位址,內容比較須用 strcmp(p, a) == 0。// 陣列
char a[] = "hello";
char b[10];
strcpy(b, a); // 不能用 b = a
if (strcmp(b, a) == 0) ... // 不能用 if (b == a)
// 指標
int len = strlen(a);
char* p = (char*)malloc(sizeof(char)*(len+1));
strcpy(p, a); // 不要用 p = a
if (strcmp(p, a) == 0) ... // 不要用 if (p == a)