首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

單片機 C 語言指標與變數實務:定義順序、記憶體模型、指標位址對比

     編輯:關於C語言

前言

Keil 單片機 C 開發中,指標未指向有效變數會導致亂碼。本文記錄實測現象與記憶體模型解析。

現象一:指標必須指向已定義變數

/* 錯誤:未定義變數直接用指標 */
Type *p, *q;
/* p, q 指向隨機位址,操作導致混亂 */

/* 正確:先定義變數,再讓指標指向 */
Type *p, *q, var1, var2;
p = &var1; q = &var2;  /* 穩定可靠 */

原因:指標僅儲存位址,若無對應變數,位址內容為隨機垃圾值,寫入會破壞其他資料。

現象二:指標自身位址 vs 指向位址

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` (變數位址) 編譯期固定。

單片機開發建議

  1. **先定義變數/結構體實例,再定義指標指向它們**。
  2. 指標宣告即初始化:`Type *p = &var;` 或 `Type *p = NULL;`。
  3. 嚴禁使用未初始化指標 (野指標)。
  4. 理解 `p` (指向位址)、`&p` (自身位址)、`*p` (所指物件) 三者區別。
  5. Keil 模擬器/串口輸出觀察位址值,驗證指標指向正確性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved