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

嵌入式 C 內存操作進階:絕對地址訪問、函數指針與動態分配陷阱

     編輯:C 語言基礎

數據指針操作絕對地址

嵌入式常需直接讀寫特定物理地址(I/O 映射寄存器、雙端口 RAM、字模庫)。

unsigned char *p = (unsigned char*)0xF000FF00;
*p = 11;  // 向絕對地址寫入

// 指針算術由指向類型決定
int *pi = (int*)0xF000FF00;
pi++;  // 地址 + sizeof(int) = +2 (16位) 或 +4 (32位)
CPU 以字節編址,C 指針以指向類型大小為步長自增/自減。嵌入式開發必須牢記此差異。

函數指針本質與妙用

  1. 函數名 = 函數代碼入口地址
  2. 調用本質 = 將地址載入 PC 指針寄存器
  3. 可「調用」不存在的函數實體 → 實際是跳轉到任意地址執行
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:啟動時一次性分配,運行期不再動態申請

指針自增自減速查表

指向類型sizeofp++ 效果
char / uint8_t1地址 +1
short / int16_t2地址 +2
int / int32_t4地址 +4
long long / int64_t8地址 +8
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved