Arrays 为什么我们要在C中指定大小\u t数组大小,而不仅仅是使用整数?这样做的好处是什么?

Arrays 为什么我们要在C中指定大小\u t数组大小,而不仅仅是使用整数?这样做的好处是什么?,arrays,c,size-t,Arrays,C,Size T,我开始学习C语言,我的一个家庭作业要求我创建一个数组 size\t const N\u MAX=10;双v1[N_MAX] 我知道size_t表示v1数组长度,但我仍然不知道size_t类型在这里的作用,而不是使用int N_MAX 大小\u t可以存储理论上可能的对象的最大大小 任何类型(包括数组) size_t通常用于数组索引和循环计数。程序 使用其他类型(如unsigned int)进行数组索引的 故障开启,例如,当索引超过UINT_MAX或 依赖于32位模运算 () 这意味着size\u

我开始学习C语言,我的一个家庭作业要求我创建一个数组
size\t const N\u MAX=10;双v1[N_MAX]
我知道size_t表示v1数组长度,但我仍然不知道size_t类型在这里的作用,而不是使用int N_MAX

大小\u t可以存储理论上可能的对象的最大大小 任何类型(包括数组)

size_t通常用于数组索引和循环计数。程序 使用其他类型(如unsigned int)进行数组索引的 故障开启,例如,当索引超过UINT_MAX或 依赖于32位模运算

()

这意味着
size\u t
保证能够在您编译的任何平台上保存任何大小/索引计数

它通常是基于您编译的目标平台定义的。例如,Windows SDK中包含的
intsafe.h
头将其定义如下:

\ifdef\u WIN64
typedef uu int64 ptrdiff t;
typedef unsigned\uu int64 size\u t;
#否则
typedef int ptrdiff\t;
typedef unsigned int size\u t;
#恩迪夫
直接使用
size\t
意味着您不必担心在为不同的体系结构(例如x86与x86-64)重新编译时更改用于索引或保存对象大小的数据类型

编辑:正如@Eric Postdischil在评论中提到的,C标准的实际措辞与我从参考文献中链接的解释不同

查看我们可以看到一些关于
尺寸的提及:

6.5.3.4操作员的尺寸和校准

[……]

5两个运算符的结果值都是实现定义的, 其类型(无符号整数类型)是size\u t,在中定义 (和其他标题)

[……]

7.19共同定义

[……]

尺寸 它是sizeof运算符结果的无符号整数类型

size\u t
sizeof
运算符返回的值的类型,这一事实是我们可以假设“size\u t可以存储任何类型的理论上可能对象的最大大小”的原因,但在标准中没有实际规定这一点。该标准还规定了以下关于
sizeof

sizeof运算符生成其操作数的大小(以字节为单位),该操作数 可以是表达式或类型的括号名称。尺寸是 根据操作数的类型确定。结果是一个整数。如果 操作数的类型是可变长度数组类型,即操作数 进行评估;否则,将不计算操作数并返回结果 是一个整数常量

我的解释(这可能是错误的)是,您不能拥有大小不适合
大小的对象,因为在这种情况下,您不能拥有
运算符的工作
大小

编辑2:

我在这里引用Eric Postphil的话:

我们可以用计算机做的事情是有限的,而且 有时计算会越界。这通常是容易的 定义尺寸的现代硬件,使sizeof始终有效,而您 显然,不能对较大的对象进行malloc,但可以构造一个 使用静态数组,在某些深奥的16位实现中 大小不超过22位地址


是否需要稍后在程序中获取数组大小?例如,在数组上迭代(循环)?也许当您只有一个指向其第一个元素的指针时?然后,您需要一些其他方法来指定大小,例如使用命名常量而不是使用。在C中,宏主要用于此目的,而不是
const
变量(因为C中的
const
变量实际上不是编译时常量,只是一个无法修改其值的变量)。
size\u t
无符号类型的别名。这意味着它不能变成负值。它应该用于-顾名思义-大小。当您使用64位指针时,32位
int
可能不够大,无法表示所指对象的大小。请您回答问题,以澄清您真正的问题?您是否询问如何使用变量
N_MAX
?或者你在问为什么它需要是一个
size\u t
而不是普通的
int
?或者是别的什么?@某个程序员伙计,我不确定我是否理解你的评论。这就是我所说的:在为另一个平台编译源代码时,不必担心对象大小的数据类型是否正确(例如,x86 vs x86_64)。哦,我明白这可能会产生误导。我编辑了我的答案。谢谢Re“
size\u t
保证……”:C标准不保证这一点。毫无疑问,
size\u t
适用于大小,并且在C实现中可以容纳任何对象的大小,但是标准所说的是
size\u t
是“无符号整数类型的
sizeof
运算符的结果”。CpPraceCeNe.com已经发现有很多错误,它当然不是C或C++标准的权威来源。@ Eric Postpischil我编辑了我的答案。“……”……“在这种情况下,你不能有一个工作<代码> siZoof 运算符”:许多操作符都有它们不工作的值。例如,
*
INT\u MAX*INT\u MAX
中失败。这一点在C 2018 5.2.4中得到了阐述:对于我们可以用计算机做什么,存在一些简单的限制,有时计算会超出范围。在现代硬件上,通常很容易定义
size\u t
,这样
sizeof
总是有效的,而且显然不能
malloc
一个更大的对象,但在一些深奥的实现中,您可以用静态数组构造一个对象