我对C语言中的size_t
感到困惑。我知道它是由sizeof
运算符返回的。但它究竟是什么?它是一种数据类型吗?
假设我有一个for
循环:
for(i = 0; i < some_size; i++)
我应该使用int i;
还是size_t i;
?
size_t是无符号整数数据类型。在使用GNU C库的系统上,它将是unsigned int或unsigned long int。size_t通常用于数组索引和循环计数。
通常情况下,如果你从0开始递增,为了避免溢出导致负值情况的发生,应该使用无符号类型。这一点非常重要,因为如果你的数组边界小于循环的最大值,但是循环的最大值大于类型的最大值,那么你将会溢出并且可能会遇到分段错误(SIGSEGV)。因此,通常情况下,在从0开始递增的循环中永远不要使用int类型,而是使用无符号类型。
这是一个特定于平台的typedef
。例如,在特定的机器上,它可能是unsigned int
或unsigned long
。您应该使用此定义来使您的代码更具可移植性。
size_t或任何无符号类型可能被用作循环变量,因为循环变量通常大于或等于0。
当我们使用size_t对象时,我们必须确保在所有上下文中它被使用时,包括算术运算,我们只需要非负值。例如,以下程序肯定会给出意外的结果:
// C program to demonstrate that size_t or
// any unsigned int type should be used
// carefully when used in a loop
#include<stdio.h>
int main()
{
const size_t N = 10;
int a[N];
// This is fine
for (size_t n = 0; n < N; ++n)
a[n] = n;
// But reverse cycles are tricky for unsigned
// types as can lead to infinite loop
for (size_t n = N-1; n >= 0; --n)
printf("%d ", a[n]);
}
Output
Infinite loop and then segmentation fault
据我理解,size_t
是一个无符号整数,其位大小足以容纳本地架构的指针。
所以:
sizeof(size_t) >= sizeof(void*)
size_t
更大。例如:在 x86 实模式上的 C 编译器可以有 32 位的 FAR
或 HUGE
指针,但 size_t
仍然是 16 位。另一个例子:Watcom C 曾经使用特殊的 48 位宽度的“fat”指针来扩展内存,但 size_t
却没有。在具有哈佛体系结构的嵌入式控制器上,两者也没有关联,因为它们涉及不同的地址空间。 - Patrick Schlütersize_t
的例子。 - Patrick Schlüter
some_size
是有符号的,使用int
,如果它是无符号的,使用size_t
。 - Nate