在 Linux 下編譯執行以下程式會發生「段錯誤」,但在某些 Unix 系統卻能正常運行:
int main() {
char *a = "11111111";
char *b = "2222222";
printf("before a:%s b:%s\n", a, b);
memcpy(a, b, 8); // 嘗試修改 a 指向的記憶體
printf("after a:%s b:%s\n", a, b);
return 0;
}
char *a = "..." 讓指標指向程式碼段的常量區,屬於唯讀記憶體。char a[] = "11111111"; // 陣列初始化,內容可修改
char b[] = "2222222";
memcpy(a, b, 8); // 安全
char *a = malloc(8);
char *b = malloc(8);
memcpy(a, "00000000", 8);
memcpy(b, "11111111", 8);
// 使用完畢需 free(a); free(b);
| 宣告方式 | 儲存位置 | 可修改性 |
|---|---|---|
char *p = "abc"; | 唯讀資料段 | 不可修改 |
char p[] = "abc"; | 堆疊(區域變數)或資料段(全域) | 可修改 |
char *p = malloc(N); | 堆疊 | 可修改,需手動釋放 |
const char * 讓編譯器協助檢查。