在Keil單片機C編程中,指針與變量的正確搭配至關重要。許多初學者容易犯一個錯誤:直接使用未指向具體變量的指針進行操作,導致程序運行混亂甚至崩潰。
Type *p, *q; // 直接給指針賦值,但未定義實際變量 // 此時 p 和 q 指向的內存地址是隨機的
這種寫法會導致指針指向不可預測的內存區域,讀寫操作將產生未定義行為。
Type *p, *q, pp, qq; // 先定義實際變量 pp 和 qq p = &pp; // 指針指向已分配的變量 q = &qq;
結論: 必須先分配變量內存,再讓指針指向該地址。指針本質上只是存儲地址的變量,若無實際變量存在,指針操作就是在操作隨機內存。
通過一個實際串口調試案例來說明:
rf_packet_info *buff, buffer; uart_sendbyte(buff); // 輸出指針 buff 存儲的值(即所指變量地址) uart_sendbyte(&buff); // 輸出指針 buff 自身的地址 uart_sendbyte(&buffer); // 輸出變量 buffer 的地址 buff = &buffer; // 讓指針指向實際變量 uart_sendbyte(buff); // 再次輸出 uart_sendbyte(&buff); uart_sendbyte(&buffer);
第一次運行:
後續運行:
uart_sendbyte(buff):指針內存儲的內容(所指變量地址),指向前為隨機值uart_sendbyte(&buff):指針自身的地址(固定不變)uart_sendbyte(&buffer):變量 buffer 的地址(固定不變)第一次運行時,buff 未初始化指向隨機地址(03),賦值後指向 buffer(27)。指針自身地址(&buff = 21)和變量地址(&buffer = 27)始終不變。
NULL 或指向合法變量NULL 且指向有效內存