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