我最近看到很多人说你应该用size_t
而不是int
.但有什么不同呢?它总是更好吗?还是有int
种情况,size_t
种情况?或者size_t
可能类似于long
?我应该什么时候用int
,什么时候用size_t
,什么时候用long?
我最近看到很多人说你应该用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_t
和ptrdiff_t
.
因此,size_t
提供了与sizeof
运算符以及各种标准库函数(例如strlen
)更好的兼容性.大多数情况下,在将使用int
的草率编写的代码移植到64位系统时,这些问题会expose 出来.
然而,size_t
也不是没有问题,因为它的大小尚不清楚.在某些情况下,如与硬件相关的编程,stdint.h
中的固定宽度类型可能比size_t
更适合使用,或者您可能会冒着获得太大类型的风险.
一些旧的C库的遵从性也很差,不能正确地支持%zu
的printf/scanf系列函数.