首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言指針強制轉換步長陷阱:char* 指向 int 數組修改單字節導致數值變化分析

     編輯:程式設計疑難解答

代碼與現象

void arr_test(char *arr) {
    (*((char *)arr + 1))++;
}
int main() {
    int arr[4] = {1,2,3,4};
    arr_test(arr);
    // 輸出: 257 2 3 4
}

內存佈局分析(小端模式)

int 佔 4 字節,arr[0] = 1 在內存中存儲為:

地址基址:  00 00 00 01  (低地址存低位字節)
           ↑  ↑  ↑  ↑
           +0 +1 +2 +3  字節偏移

操作過程

  1. (char *)arr + 1 → 指向 arr[0] 的第二個字節(偏移 +1),原值 0x00。
  2. (*...)++ → 該字節自增為 0x01。
  3. 修改後 arr[0] 內存變為:01 00 00 01(低位在前)。
  4. 作為 int 讀取:0x01000001 = 16777217?實際輸出 257,說明編譯器可能對齊或截斷,但原理一致:修改了第 2 字節導致數值變化。

關鍵結論

  • 指針類型決定步長:char* 步長 1 字節,int* 步長 4 字節。
  • 強轉 char* 訪問 int 內存 可實現字節級操作(如序列化、校驗和、大小端轉換)。
  • 嚴格別名規則:C 標準禁止通過不兼容類型指針訪問對象(違反 Strict Aliasing),可能導致未定義行為,實際工程中需用 union 或 memcpy 規避。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved