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

C語言函數返回局部字串指針導致亂碼/崩潰:正確姿勢三選一

     編輯:程式設計疑難解答

錯誤代碼

char* get_input() {
    char str[MAX];  // 局部數組,棧上分配
    // ... 填充 str ...
    return str;     // 函數結束,str 內存被回收,返回野指針
}

現象

  • 函數內 puts(str) 正常(內存尚未覆蓋)。
  • 函數外接收指針打印 → 亂碼/段錯誤。

三種修復方案

方案代碼示例適用場景
1. 靜態局部變數static char str[MAX];單線程、無重入需求、數據生命週期全程
2. 動態分配char* str = malloc(MAX); 調用者 free()多線程、可重入、長度不定
3. 傳出參數void get_input(char* buf, int size) 調用者分配嵌入式/無堆環境、調用者控制生命週期

方案 3 完整示例(推薦)

#define MAX 100

void get_input(char* buf, int size) {
    int i = 0;
    buf[0] = '$';
    while (i < size - 1) {
        int ch = getchar();
        if (ch == '=' || ch == EOF) break;
        buf[++i] = ch;
    }
    buf[i+1] = '\0';
}

int main() {
    char buf[MAX];
    get_input(buf, MAX);
    puts(buf);
    return 0;
}

核心原則

永遠不要返回棧上局部變數的地址。 要么靜態、要么堆、要么調用者傳buf。

搞懂棧內存生命週期,C 語言指針錯誤減少 90%!

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