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

size_t 與 ssize_t:跨平台移植的關鍵類型

     編輯:關於C語言

為了讓代碼在 32/64 位系統間無縫移植,C 標準庫定義了 size_t 與 ssize_t。本文解析其定義、語義、典型用法及常見誤區。

一、size_t:無符號計數類型

  • 定義: typedef unsigned int size_t; (32位) / typedef unsigned long size_t; (64位)
  • 語義: 「能表示最大對象字節大小的無符號整數」,保證容納任意數組下標、內存塊大小
  • 來源: <stddef.h>、<stdlib.h>、<stdio.h> 等

典型使用場景

  1. sizeof 運算符返回類型
  2. 數組下標、循環計數器
  3. 內存管理函數參數/返回值:malloc(size_t)、memcpy(void*, void*, size_t)、strlen() 返回值

二、ssize_t:有符號計數類型

  • 定義: typedef signed int ssize_t; (32位) / typedef signed long ssize_t; (64位)
  • 語義: 表示可讀寫字節數,允許負值表示錯誤(如 read()/write() 返回 -1 表示失敗)
  • POSIX 標準,非 C 標準庫(Windows 無 ssize_t,常用 intptr_t 或 long 替代)

三、核心差異與選擇指南

特性size_tssize_t
符號性無符號有符號
錯誤表示無(通常配合 NULL/錯誤碼)負值(如 -1)
適用場景大小、計數、下標I/O 返回值、可為負的差值
可移植性C99 標準POSIX,Windows 需替代

四、常見陷阱

// 陷阱 1:有符號/無符號比較
int len = -1;
size_t n = 10;
if (len < n) ... // len 隱式轉為巨大無符號數,條件為真!

// 陷阱 2:printf 格式
size_t s = sizeof(int);
printf("%zu\n", s); // C99 %zu,非 %d/%u/%ld

// 陷阱 3:64位截斷
long addr = (long)ptr; // 64位指針截斷為 32位
intptr_t addr = (intptr_t)ptr; // 正確:足以容納指針

五、最佳實踐

  1. 涉及大小/計數/下標 → size_t
  2. 系統調用返回值(可能為 -1) → ssize_t (POSIX) / intptr_t (跨平台)
  3. 指針算術/差值 → ptrdiff_t (C 標準有符號差值類型)
  4. 格式化輸出 → %zu (size_t)、%zd (ssize_t/ptrdiff_t)、%td (ptrdiff_t)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved