我最近看到很多人说你应该用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++相关问答推荐

理解没有返回语句的递归C函数的行为

从C函数调用asm函数时生成错误的BLX指令(STM32H753上的gcc)

如何将字符串argv[]赋给C中的整型数组?

如何使用低级C++写出数值

C由四个8位整数组成无符号32位整数

为什么net/if.h在ifaddrs.h之前?

为静态库做准备中的奇怪行为

Sizeof(&Q;字符串&Q;)的正确输出是什么?

在每种If-Else情况下执行语句的最佳方式

在创建动态泛型数组时,通过realloc对故障进行分段

如何用C语言为CLI应用程序编写按键检测系统?

错误:字符串在C中获得意外输出

从C中的函数返回静态字符串是不是一种糟糕的做法?

为什么我无法访问C语言中的文件

问题:C#Define上的初始值设定项元素不是常量

从系统派生线程调用CRT

使用 _Atomic float 时,MSVC 编译的代码会命中调试断言

OpenGL 中的非渐变 colored颜色 变化

如何在 C 中编辑 struct 体中的多个变量

char* 上的 free() 被 valgrind 识别为无效