int main() {
char *a = "11111111";
char *b = "2222222";
memcpy(a, b, 8); // 段錯誤
return 0;
}
Linux 下崩潰,Unix 下可能正常(實現差異)。
"11111111" 是字符串字面量,存儲在只讀數據段(.rodata)char *a 指向只讀內存memcpy 嘗試寫入只讀區域 → 段錯誤int main() {
char a[] = "11111111"; // 數組初始化,內容拷貝到棧
char b[] = "2222222";
memcpy(a, b, 8); // 正常
return 0;
}
int main() {
char *a = malloc(9);
char *b = malloc(9);
strcpy(a, "11111111");
strcpy(b, "2222222");
memcpy(a, b, 8);
free(a); free(b);
return 0;
}
const char *a = "11111111"; // 編譯器阻止修改操作
// memcpy(a, b, 8); // 編譯錯誤:discards 'const' qualifier
| 聲明方式 | 存儲區域 | 可修改 | 用途 |
|---|---|---|---|
char *p = "str" | .rodata (只讀) | 否 | 只讀訪問 |
char p[] = "str" | 棧 (或數據段) | 是 | 需修改內容 |
char *p = malloc() | 堆 | 是 | 動態大小/長生命周期 |
const char * 接收-Wwrite-strings(C++ 默認開啟)