我最近看到很多人说你应该用size_t而不是int.但有什么不同呢?它总是更好吗?还是有int种情况,size_t种情况?或者size_t可能类似于long?我应该什么时候用int,什么时候用size_t,什么时候用long?

推荐答案

主要原因是自文档化代码.size_t完全用于描述物体的大小.

但是,使用size_t比使用int也有一些实际的优势:

  • 数组/对象大小始终是无符号的正数,因此应由无符号类型表示.使用负值作为数组大小始终是一个错误.使用负值作为数组索引也是有问题的,因为它很难读取,probably也是一个错误.

  • int在某些情况下可能会溢出,因为它不够大,无法包含请求的大小.size_t被保证至少足够大以容纳最大支持对象的大小.

  • 如果int在同一表达式中与较大的操作数混合,则它可能会受到隐式提升的影响.例如,考虑一下这个微妙的错误:

    size_t size = sizeof(new_array); // new array to copy data from
    int modifier = -4; // reduce size by a certain number of bytes
    ptr = realloc(old_array, size + modifier); // oops
    assert(ptr); old_array = ptr;
    memcpy(old_array, new_array, size + modifier); // oops
    
  • 如果用来表示地址,或者如果用来存储指针算术的结果,则int更有问题.这里还有其他更合适的类型,分别像uintptr_tptrdiff_t.

因此,size_t提供了与sizeof运算符以及各种标准库函数(例如strlen)更好的兼容性.大多数情况下,在将使用int的草率编写的代码移植到64位系统时,这些问题会expose 出来.

然而,size_t也不是没有问题,因为它的大小尚不清楚.在某些情况下,如与硬件相关的编程,stdint.h中的固定宽度类型可能比size_t更适合使用,或者您可能会冒着获得太大类型的风险.

一些旧的C库的遵从性也很差,不能正确地支持%zu的printf/scanf系列函数.

C++相关问答推荐

如何将一个enum类型类型转换为另一个类型?

设计处理各种数据类型的方法和数据 struct

GCC:try 使用—WError或—pedantic using pragmas

sizeof结果是否依赖于字符串的声明?

在32位处理器上优化53—32位模计算>

如何设置指针指向在函数中初始化的复合文字中的整数?

在传统操作系统上可以在虚拟0x0写入吗?

具有交换链获取和命令缓冲区提交的同步-危险-读后写错误

限制不同类型的限定符

tick.q中的Kdb+键控表语法

如何在POSIX-UEFI中获得输入?

在进程之间重定向输出和输入流的问题

如何使用libgpio(d)为Raspberry Pi编译C程序?

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

如何在c中使用具有不同变量类型的内存分配?

用C++高效解析HTTP请求的方法

如何在Rust中处理C的longjmp情况?

无法在线程内用 C 打印?

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?

strlen 可以是[[未排序]]吗?