首页 > 解决方案 > 应该使用什么类型来循环数组?

问题描述

让我们有这个数组:

char arr[SIZE_MAX];

我想循环遍历它(并且超过它的最后一个元素):

char *x;

for (i = 0; i <= sizeof(arr); i++)
        x = &arr[i];

(编辑以添加一些带有指针的有效代码)。

最适合的类型是i什么?

我接受非标准类型,例如 POSIX 的类型。

相关问题:

将 sizeof() 的结果赋值给 ssize_t

标签: cposixsizeof

解决方案


让我们有这个数组:

char arr[SIZE_MAX];

请注意,许多 C 实现会拒绝这一点,SIZE_MAX因为它们比它们实际支持的任何数组都大。 SIZE_MAX是 type 的最大值size_t,但这与对象的(依赖于实现的)最大大小不同。

我想循环遍历它(并且经过它的最后一个元素):

for (i = 0; i <= sizeof(arr); i++)

最适合 i 的类型是什么?

没有我们可以确信能够表示的可用类型SIZE_MAX + 1并且假设arr确实有 size SIZE_MAX,您需要i's 类型能够表示该值以避免无限循环。除非您无限循环,这是可能的,尽管不太可能。

另一方面,如果我们有

char arr[NOT_SURE_HOW_LARGE_BUT_LESS_THAN_SIZE_MAX];

那么合适的类型isize_t. 这是sizeof运算符结果的类型,如果我们唯一的假设是对象的大小小于SIZE_MAXthensize_t是我们可以确信的唯一类型将达到目的。

如果我们可以对对象的大小进行更严格的限制,那么选择不同的类型可能是有利的。特别是,如果我们可以确信它比UINT_MAXthen更小,那么它unsigned int可能是一个性能略高的选择。当然,带符号的类型也可以用于i,前提是它们实际上可以表示所有需要的值,但这可能会引起一些编译器的警告。


推荐阅读