我对C语言中的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
是一个无符号数据类型 由几个C/C++标准定义。 例如,C99 ISO/IEC 9899标准。 它被定义在stddef.h
中。 可以通过加入以下内容进一步导入 &gt;stdlib.h
,因为这个文件在内部是子文件。 包括stddef.h
。这个类型用来表示 一个对象的大小。库函数 接受或返回大小的库函数希望它们 的类型或返回类型为 为
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 */
这是因为分配给diff
的值总是一个正数,即使是s2 < s1
,因为计算是用无符号类型完成的。 在这种情况下,根据你的使用情况,你可能最好使用int
(或long long
)来表示s1
和s2
。
在C/POSIX中有一些函数可以/应该使用size_t
,但由于历史原因没有使用。 例如,fgets
的第二个参数最好是size_t
,但却是int
。