首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言指針數組輸入字符串:正確處理 char* p[] 參數與內存分配

     編輯:程式設計綜合問答

錯誤代碼分析


// 問題函數
void get(char *p[], int n) {
    for (int i = 0; i < n; i++) {
        cin >> p[i]; // p[i] 是野指針,未分配內存 → 崩潰/未定義行為
    }
}

p[i] 只是指針變量,指向隨機地址,直接寫入導致內存破壞。

正確模式三種

1. 調用者預分配二維數組(最簡單)


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);

2. 函數內動態分配(靈活)


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]);

3. 單個緩衝區複用(不保存歷史)


void get(char *p) { // 單指針
    scanf("%s", p);
}

// 調用
char buffer[100];
get(buffer); // 直接用緩衝區

關鍵區別表

場景參數類型內存責任適用性
固定最大行/長char p[][LEN]調用者棧上簡單、高效、安全
動態行數/長度char **p / char *p[]函數分配/調用者釋放靈活、需嚴格配對
單行處理char *p調用者提供緩衝最輕量

scanf/cin 安全增強


// 防止緩衝區溢出
scanf("%99s", p[i]); // 限制讀取99字符,留1位給\0
// 或
cin.width(100); cin >> p[i]; // C++ 流寬度限制

**核心原則**:指針數組元素**必須指向有效內存**才能寫入。新手優先用二維數組 char buf[N][LEN],避開指針陷阱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved