协慌网

登录 贡献 社区

C 语言中的 size_t 是多少?

size_t感到困惑。我知道它是由sizeof运算符返回的。但是到底是什么呢?它是数据类型吗?

假设我有一个for循环:

for(i = 0; i < some_size; i++)

我应该使用int i;size_t i;

答案

从维基百科

根据 1999 ISO C 标准(C99), size_t是至少 16 位的无符号整数类型(请参见 7.17 和 7.18.3 节)。

size_t stddef.h定义的几种 C / C ++ 标准(例如 C99 ISO / IEC 9899 标准)定义的无符号数据类型。 1 stdlib.h进一步导入它,因为此文件在内部包含stddef.h

此类型用于表示对象的大小。具有或返回大小的库函数期望它们是 type 或具有size_t的返回类型。此外,最常用的基于编译器的运算符 sizeof 应该评估为与size_t兼容的常数。

言外之意, size_t是保证保留任何数组索引的类型。

size_t是无符号类型。因此,它不能表示任何负值(<0)。您在计数某物时使用它,并确保它不能为负数。例如, strlen()返回size_t因为字符串的长度必须至少为 0。

在您的示例中,如果循环索引将始终大于 0,则可以使用size_t或任何其他无符号数据类型。

使用size_t对象时,必须确保在所有上下文(包括算术)中都使用非负值。例如,假设您有:

size_t s1 = strlen(str1);
size_t s2 = strlen(str2);

并且您想找到str2str1的长度差。您不能执行以下操作:

int diff = s2 - s1; /* bad */

这是因为s2 < s1 diff的值也总是正数,因为计算是使用无符号类型完成的。在这种情况下,根据您的用例,可能最好对s1s2 int (或long long )。

C / POSIX 中有一些功能可以 / 应该使用 size_t,但是由于历史原因,它们并不是size_t fgets的第二个参数理想上应该是size_t ,但是int

size_t是可以容纳任何数组索引的类型。

根据实现的不同,它可以是以下任意一种:

unsigned char

unsigned short

unsigned int

unsigned long

unsigned long long

这是在我的机器的stddef.h size_t

typedef unsigned long size_t;