CSAPP 習題 2.7 解答:show_bytes 輸出字符串字節流的跨平台一致性
CSAPP 2.7 考察字符串字節序列在內存中的真實分布。給定 const char *s = "abcdef",調用 show_bytes(s, strlen(s)),輸出什麼?為什麼與字節序、字長無關?
show_bytes 實現
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer p, int n) {
for (int i = 0; i < n; i++)
printf(" %.2x", p[i]);
printf("\n");
}
執行過程分析
strlen("abcdef") = 6(不含結束符 \0)。
- 循環按索引
p[0]...p[5] 依次訪問 6 個字節。
- ASCII 碼:
'a'=0x61, 'b'=0x62, 'c'=0x63, 'd'=0x64, 'e'=0x65, 'f'=0x66。
- 輸出:61 62 63 64 65 66。
為何跨平台一致?
| 因素 | 影響 | 理由 |
| 字節序 | 無 | 逐字節訪問 p[i],不涉及多字節整型讀取 |
| 字長 (32/64 位) | 無 | 指針算術以字節為單位,char* 步長恒為 1 |
| 對齊要求 | 無 | char 無對齊限制,任意地址可訪問 |
核心結論
文本數據(字節流)天然具有平台無關性,而二進制整型/浮點數數據則依賴字節序與字長。這是網絡協議、文件格式普遍採用文本或定義明確字節序的根本原因。
延伸驗證代碼
#include <stdio.h>
#include <string.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer p, int n) {
for (int i = 0; i < n; i++) printf(" %.2x", p[i]);
puts("");
}
int main() {
const char *s = "abcdef";
show_bytes((byte_pointer)s, strlen(s)); // 61 62 63 64 65 66
// 對比:整型數組會受字節序影響
int arr[] = {0x01020304};
show_bytes((byte_pointer)arr, 4); // 小端: 04 03 02 01
return 0;
}
實戰啟示
- 序列化:優先用文本(JSON、Protobuf 文本模式)或顯式指定字節序的二進制格式。
- 調試:
show_bytes 模式是查看原始內存的利器,建議封裝進通用調試庫。
- 安全:字符串處理函數(
strlen/strcpy)按字節語義工作,天然免疫字節序漏洞。
CSAPP 2.7 用最簡單的字符串例證了「字節是內存的原子單位」這一深刻真理。
- 上一篇文章: CSAPP 習題 2.6 解答:整數與浮點數位模式相似度分析
- 下一篇文章: CSAPP 習題 2.8 解答:位向量布爾運算真值表完整推導
Copyright ©
程式碼之家 All Rights Reserved