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) 調用者分配 | 嵌入式/無堆環境、調用者控制生命週期 |
#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%!