// 問題函數
void get(char *p[], int n) {
for (int i = 0; i < n; i++) {
cin >> p[i]; // p[i] 是野指針,未分配內存 → 崩潰/未定義行為
}
}
p[i] 只是指針變量,指向隨機地址,直接寫入導致內存破壞。
void get(char p[][MAX_LEN], int n) { // 形參退化為指向數組的指針
for (int i = 0; i < n; i++) {
scanf("%s", p[i]); // 或 cin >> p[i];
}
}
// 調用
char buffer[10][100]; // 10行,每行最多99字符
get(buffer, 10);
void get(char *p[], int n) {
for (int i = 0; i < n; i++) {
p[i] = malloc(MAX_LEN); // 分配內存
if (!p[i]) exit(1);
scanf("%s", p[i]);
}
}
// 調用後必須釋放
char *arr[10];
get(arr, 10);
// 使用...
for (int i = 0; i < 10; i++) free(arr[i]);
void get(char *p) { // 單指針
scanf("%s", p);
}
// 調用
char buffer[100];
get(buffer); // 直接用緩衝區
| 場景 | 參數類型 | 內存責任 | 適用性 |
|---|---|---|---|
| 固定最大行/長 | char p[][LEN] | 調用者棧上 | 簡單、高效、安全 |
| 動態行數/長度 | char **p / char *p[] | 函數分配/調用者釋放 | 靈活、需嚴格配對 |
| 單行處理 | char *p | 調用者提供緩衝 | 最輕量 |
// 防止緩衝區溢出
scanf("%99s", p[i]); // 限制讀取99字符,留1位給\0
// 或
cin.width(100); cin >> p[i]; // C++ 流寬度限制
**核心原則**:指針數組元素**必須指向有效內存**才能寫入。新手優先用二維數組 char buf[N][LEN],避開指針陷阱。