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

CSAPP 習題 2.7 解答:show_bytes 輸出字符串字節流的跨平台一致性

     編輯:關於C語言

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");
}

執行過程分析

  1. strlen("abcdef") = 6(不含結束符 \0)。
  2. 循環按索引 p[0]...p[5] 依次訪問 6 個字節。
  3. ASCII 碼:'a'=0x61, 'b'=0x62, 'c'=0x63, 'd'=0x64, 'e'=0x65, 'f'=0x66。
  4. 輸出:61 62 63 64 65 66。

為何跨平台一致?

核心結論

文本數據(字節流)天然具有平台無關性,而二進制整型/浮點數數據則依賴字節序與字長。這是網絡協議、文件格式普遍採用文本或定義明確字節序的根本原因。

延伸驗證代碼

#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 用最簡單的字符串例證了「字節是內存的原子單位」這一深刻真理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
因素影響理由
字節序無逐字節訪問 p[i],不涉及多字節整型讀取
字長 (32/64 位)無指針算術以字節為單位,char* 步長恒為 1
對齊要求無char 無對齊限制,任意地址可訪問