typedef unsigned char * char_point;(字節指針)。int_cp、float_cp 將變量地址強轉為 char_point 返回。endian 以字節為單位打印內存內容(cp[i] 訪問第 i 字節)。&i 強轉 vs 通過函數返回指針再傳入。函數參數傳遞改變了變量在棧上的內存地址。
&i:`i` 在 `main` 棧幀中,地址固定,內存佈局連續。main 棧幀: int_cp 棧幀 (調用時):
[ i: 0x21893678 ] [ i 副本: 0x21893678 ] <-- 返回 &副本
[ 返回地址 ... ]
[ 舊 ebp ... ]
返回後 int_cp 棧幀彈出,副本內存被標記可覆蓋,指針懸空。
// 修改 int_cp 簽名,接受指針參數
char_point int_cp(int *p) { // 接收 main 中 i 的地址
printf("i: %d\n", *p);
printf("&i: %p\n", (void*)p);
printf("(c_p)&i: %p\n", (char_point)p);
return (char_point)p; // 返回原地址
}
// main 中調用
endian(int_cp(&i), sizeof(i)); // 傳遞 &i,而非 i
0x21893678 內存順序:78 36 89 21(`endian` 打印順序)。21 89 36 78。913.45678f(IEEE 754 單精度):符號位(0) + 指數(10001111) + 尾數...,內存字節序同理取決於端模式。