int vs size_t vs long

问题描述 投票:0回答:1

我最近看到很多人说你应该使用

size_t
而不是
int
。但有什么区别呢?总是更好吗?或者有
int
的情况,以及
size_t
的情况吗?或者也许
size_t
long
相似?什么时候该用
int
,什么时候该用
size_t
,什么时候该用
long?

c integer long-integer size-t
1个回答
4
投票

主要原因是自记录代码。

size_t
专门用于描述事物的大小。

但是使用

size_t
相对于
int
也有一些实际优势:

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

  • 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_t
    ptrdiff_t

因此,

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

然而

size_t
也不是没有问题,因为它的大小未知。在某些场景(例如与硬件相关的编程)中,
stdint.h
中的固定宽度类型可能比
size_t
更适合使用,否则您可能会面临使用太大的类型的风险。

一些旧的 C 库的合规性也很差,并且无法正确支持

%zu
printf/scanf 系列函数。

© www.soinside.com 2019 - 2024. All rights reserved.