Arrays 为什么我们要在C中指定大小\u t数组大小,而不仅仅是使用整数?这样做的好处是什么?
我开始学习C语言,我的一个家庭作业要求我创建一个数组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
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
一个更大的对象,但在一些深奥的实现中,您可以用静态数组构造一个对象