应该使用哪种类型循环遍历数组?

时间:2019-03-22 16:07:31

标签: c posix sizeof

让我们拥有这个数组:

char arr[SIZE_MAX];

我想遍历它(以及最后一个元素):

char *x;

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

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

i最合适的类型是什么?

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

相关问题:

Assign result of sizeof() to ssize_t

3 个答案:

答案 0 :(得分:2)

  

让我们拥有这个数组:

char arr[SIZE_MAX];

请注意,许多C实现都会拒绝这样做,SIZE_MAX比它们实际支持的任何数组大。 SIZE_MAX是类型size_t的最大值,但这与对象(取决于实现)的最大大小不同。

  

我想遍历它(以及最后一个元素):

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

最适合我的类型是什么?

没有可用的 类型,我们可以自信地表示SIZE_MAX + 1,并假设arr的大小确实为SIZE_MAX,您需要i的类型能够表示该值,以避免无限循环。除非您想要无限循环,否则这是可能的,尽管可能性很小。

另一方面,如果有

char arr[NOT_SURE_HOW_LARGE_BUT_LESS_THAN_SIZE_MAX];

,则i的适当类型是size_t。这是sizeof运算符的结果类型,如果我们唯一的假设是对象的大小小于SIZE_MAX,则size_t是我们唯一可以使用的类型有信心会达到目的。

如果我们可以假设对象的尺寸更严格,则选择其他类型可能会比较有利。特别是,如果我们可以确定它比UINT_MAX小,那么unsigned int可能是性能更高的选择。当然,带符号的类型也可以用于i,条件是它们实际上可以表示所有需要的值,但这可能会引起一些编译器的警告。

答案 1 :(得分:1)

在这种情况下,

size_t是您的朋友。它保证您可以访问任何数组索引。

答案 2 :(得分:1)

嗯,有趣的情况。您希望能够循环使用,假设我们仅将其称为可能的最大数字,从而进行环绕,而不是使比较返回false。这样的事情可能会解决问题:

char arr[SIZE_MAX];
size_t i = 0;
do {
    /* whatever you wanna do here */
    ++i;
}
while ( i <= sizeof(arr) && i != 0);

因为do-while将始终执行第一次迭代,所以我们可以设置一个条件,使得循环将在i == 0时结束,并且仅在回绕到0而不是第一次迭代时才会发生。为i <= sizeof(arr)添加另一个条件,以处理我们没有回绕的情况。