嵌入式常需直接讀寫特定物理地址(I/O 映射寄存器、雙端口 RAM、字模庫)。
unsigned char *p = (unsigned char*)0xF000FF00; *p = 11; // 向絕對地址寫入 // 指針算術由指向類型決定 int *pi = (int*)0xF000FF00; pi++; // 地址 + sizeof(int) = +2 (16位) 或 +4 (32位)
CPU 以字節編址,C 指針以指向類型大小為步長自增/自減。嵌入式開發必須牢記此差異。
typedef void (*lpFunction)(void); lpFunction lpReset = (lpFunction)0xF000FFF0; // 80186 復位向量 lpReset(); // 軟復位!跳轉執行復位代碼
嵌入式 RAM 稀缺,**malloc/free 必須配對**,任何洩漏快速導致崩潰。
// ❌ 危險模式:調用者易忘記 free
char* dangerous() {
char *p = malloc(100);
return p;
}
// ✅ 安全模式:所有權明確,或靜態池
// 方案 A:調用者提供緩衝區
void safe_copy(char *dst, size_t sz);
// 方案 B:靜態內存池 + 位圖管理
// 方案 C:啟動時一次性分配,運行期不再動態申請
| 指向類型 | sizeof | p++ 效果 |
|---|---|---|
| char / uint8_t | 1 | 地址 +1 |
| short / int16_t | 2 | 地址 +2 |
| int / int32_t | 4 | 地址 +4 |
| long long / int64_t | 8 | 地址 +8 |