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 标准)定义的无符号数据类型。 1stdlib.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);
并且您想找到str2
和str1
的长度差。您不能执行以下操作:
int diff = s2 - s1; /* bad */
这是因为s2 < s1
diff
的值也总是正数,因为计算是使用无符号类型完成的。在这种情况下,根据您的用例,可能最好对s1
和s2
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;