Keil 單片機 C 開發中,指標未指向有效變數會導致亂碼。本文記錄實測現象與記憶體模型解析。
/* 錯誤:未定義變數直接用指標 */
Type *p, *q;
/* p, q 指向隨機位址,操作導致混亂 */
/* 正確:先定義變數,再讓指標指向 */
Type *p, *q, var1, var2;
p = &var1; q = &var2; /* 穩定可靠 */
原因:指標僅儲存位址,若無對應變數,位址內容為隨機垃圾值,寫入會破壞其他資料。
rf_packet_info *buff, buffer;
uart_sendbyte(buff); /* buff 內容 (未初始化) → 隨機值 */
uart_sendbyte(&buff); /* buff 自身位址 */
uart_sendbyte(&buffer); /* buffer 位址 */
buff = &buffer; /* buff 指向 buffer */
uart_sendbyte(buff); /* buff 內容 = &buffer */
uart_sendbyte(&buff); /* buff 自身位址 (不變) */
uart_sendbyte(&buffer); /* buffer 位址 (不變) */
輸出對比:
首次執行:`03 21 27` / `27 21 27`
後續執行:`27 21 27` / `27 21 27`
解析:
- `buff` (指標變數內容) 初始隨機,賦值後固定為 `&buffer`。
- `&buff` (指標自身位址) 編譯期固定。
- `&buffer` (變數位址) 編譯期固定。