C 当int可以满足数组的大小时,为什么使用size\u t?

C 当int可以满足数组的大小时,为什么使用size\u t?,c,int,standards,size-t,C,Int,Standards,Size T,C标准保证int能够存储所有可能的数组大小。至少,我从阅读§6.5.2.1第1小节(数组订阅约束)中了解到: 其中一个表达式的类型应为“指向对象类型的指针”,另一个表达式的类型应为 具有整数类型,且结果的类型为“类型” 既然我们将使用ints作为数组下标,为什么我们要使用size\u t来确定数组的大小 为什么strlen()返回size\t而int就足够了?术语“整数类型”并不意味着int——例如,char和short都是整数类型 仅仅因为可以使用int为数组下标,并不一定意味着它可以访问所有

C标准保证
int
能够存储所有可能的数组大小。至少,我从阅读§6.5.2.1第1小节(数组订阅约束)中了解到:

其中一个表达式的类型应为“指向对象类型的指针”,另一个表达式的类型应为 具有整数类型,且结果的类型为“类型”

既然我们将使用
int
s作为数组下标,为什么我们要使用
size\u t
来确定数组的大小

为什么
strlen()
返回
size\t
int
就足够了?

术语“整数类型”并不意味着
int
——例如,
char
short
都是整数类型

仅仅因为可以使用
int
为数组下标,并不一定意味着它可以访问所有可能的数组元素


更具体地说,关于
size\u t
int
的对比,一个例子是平台,其中
int
可能是16位类型,
size\u t
可能是32位类型(或者更常见的32位
int
与64位
size\u t
在当今64位平台上的区别).

size\u t是无符号整数(如int或long)的typedef

在一些64位平台中,int可以是32位,而size\u t可以是64位


它被用作更标准的尺寸标注方式。

首先,您从标准中引用的内容没有特别提到类型
int
。不,
int
不能保证足够存储任何对象(包括数组)的大小

其次,C语言并没有专门的“数组订阅”。数组订阅是通过指针算法实现的。指针算术中的整数操作数具有
ptrdiff\u t
类型。不是
size\u t
,不是
int
,而是
ptrdiff\u t
。它是一种有符号类型,顺便说一句,意味着该值可以是负数


第三,
size\u t
的目的是存储程序中任何对象的大小(即存储
sizeof
的结果)。它不打算立即用作数组索引。它恰好作为数组索引工作,因为它保证它总是足够大,可以索引任何数组。然而,从抽象的角度来看,“数组”是一种特殊的“容器”,还有其他类型的容器(基于列表的容器、基于树的容器等等)。在一般情况下,
size\u t
不足以存储任何容器的大小,因此在一般情况下,它也是数组索引的一个值得怀疑的选择。(另一方面,
strlen
是一个专门用于数组的函数,这使得
size\u t
在那里是合适的。)

整数类型不一定是“int”。“long long”和“size\u t”都是整数类型

阵列可以大于2GB。对于编写内存不足程序的人来说,此属性非常方便,例如具有大缓冲池的DBMS、具有大内存缓存的应用程序服务器等。大于2GB/4GB的阵列是64位计算的关键:)


对于strlen(),至少听起来与C标准处理数组的方式兼容,这是否有实际意义,或者是否有人见过这么大的字符串,这是另一个问题。

在编写C标准时,机器通常使用16位“int”类型,不能处理任何大于65535的单个物体 字节,但仍然能够处理大于32767字节的对象。 因为无符号整数上的算术运算足够大,可以处理最大的 这类对象的大小,但有符号整数上的算术将不会,大小\u t已定义 未签名以容纳此类对象而不必使用“long” 计算

在最大允许对象大小介于INT_MAX和 UINT_MAX,指向这样一个函数的开始和结束的指针之间的差异 对象可能太大,无法放入“int”中。而标准并没有强制执行 关于实现应该如何处理这一问题的任何要求,都是一种常见的方法 定义整数和指针环绕行为,以便 是指向字符开始和结束的指针[49152],那么即使E-S 将超过INT_MAX,它将产生一个值,当添加到S时,该值将 产量E

如今,尺寸是一个重要因素这一事实几乎没有任何真正的优势 无符号类型(因为需要大于2GB的对象的代码通常 由于其他原因,需要使用64位指针),这会导致许多类型的错误 涉及对象大小的比较会违反直觉,但 sizeof表达式生成无符号类型的事实已经足够好了
它不太可能改变。

size\u t通常是未签名的。由于字符串大小-1似乎有点无意义,所以我为什么要支持它呢?通常不支持。它必须是无符号类型。一些错误的实现曾经签署了
size\u t
,这导致了极其严重的可利用漏洞。还有
malloc
size\u t
为参数。知道用什么作为数组下标并不容易:“size_t是unsigned int的typedef。”-不一定是真的。不,
size_t
是某些unsigned类型的typedef。隐藏在
size\u t
后面的类型甚至可能是非标准的,即它可能无法表示为
unsigned int
unsigned long
等。理论上,
size\u t
可能是
unsigned long
甚至
uintmax\t
。考虑到
calloc
qsort
,和
fread
/
fwrite
都使用
size\u t
值对元素大小和元素计数,我不同意您的说法,即
size\u t