应该使用什么类型循环数组? [重复]

问题描述 投票:-8回答:3

我们有这个数组:

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

c posix sizeof
3个回答
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)添加另一个条件来处理我们没有环绕的情况。


2
投票

我们有这个数组:

char arr[SIZE_MAX];

请注意,许多C实现将拒绝它,SIZE_MAX比它们实际支持的任何数组都大。 SIZE_MAXsize_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
投票

在这种情况下,size_t是你的朋友。它保证您可以访问任何数组索引。

© www.soinside.com 2019 - 2024. All rights reserved.