您的位置:首页 >C++中size_t是什么类型?平台无关整数解析
发布于2026-02-22 阅读(0)
扫一扫,手机访问
size_t 是专为对象大小和数组索引设计的无符号整型,对应 sizeof 返回类型;32位平台通常为 unsigned int,64位为 unsigned long;必须用于标准库中所有非负计数场景,如 vector::size()、malloc 参数等,避免截断与警告。

它不是某种“高级整数”,而是 C++ 标准为**对象大小和数组索引**量身定制的无符号整型。你写 sizeof(int)、vec.size()、strlen(s),得到的类型就是 size_t —— 强制用 int 接,轻则编译警告(-Wsign-conversion),重则在 64 位系统上截断大内存值(比如 5GB 分配被当成 1GB)。
unsigned int(4 字节)unsigned long 或 unsigned long long(8 字节)<cstddef>(C++)或 <stddef.h>(C)标准库几乎把所有“非负计数”场景都绑定到了 size_t:它不是建议,是接口契约。
std::vector::size()、std::string::length() 返回 size_tmalloc()、memcpy()、memset() 的字节数参数是 size_tfor (size_t i = 0; i < vec.size(); ++i),避免 int i 和 size_t 比较引发隐式转换反例:int i = vec.size(); —— 若 vec 有 50 亿元素(64 位常见),i 直接溢出变负数,后续下标访问全错乱。
用 %d 或 %u 打印 size_t 是常见错误,尤其跨平台时会崩或输出乱码。C++ 中 std::cout 没这问题,但 C 风格 printf 必须匹配:
size_t len = strlen("hello");
printf("length: %zu\n", len); // ✅ 正确
printf("length: %u\n", len); // ❌ 可能在 64 位系统上截断高位同理,ssize_t(如 read() 返回值)必须用 %zd,它和 size_t 不兼容,不能混用。
它是无符号类型,所有算术都是模运算。这个特性常在边界检查中翻车:
size_t pos = 0;
if (pos > 0) {
--pos; // 这行永远不会执行
}
// 但若写成:
if (pos - 1 < vec.size()) { // pos == 0 → pos-1 == 18446744073709551615(64 位)
// 这里会意外进入!
}size_t 做减法后直接比较,尤其涉及 0if (pos != 0) --pos;ptrdiff_t 或显式转成有符号类型(并加断言)最易忽略的点:它看起来像“普通整数”,但语义上只适合表示“大小”和“索引”,不参与带符号计算 —— 一旦越界,不是报错,而是静默绕回,调试时极难定位。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9