C或Objective-C中的数组边界检查技术

C或Objective-C中的数组边界检查技术,objective-c,c,Objective C,C,我的目标是在使用变量作为数组的下标时,防止下界出现索引越界情况。换句话说,我想将整变量值限制为>=0。有点类似于绝对值,除了不是使一个负数为正,而是使一个负数为零 有没有比使用宏更好的方法,例如: #define gte0(value) (value < 0) ? 0 : value 定义gte0(值)(值

我的目标是在使用变量作为数组的下标时,防止下界出现索引越界情况。换句话说,我想将整变量值限制为>=0。有点类似于绝对值,除了不是使一个负数为正,而是使一个负数为零

有没有比使用宏更好的方法,例如:

#define gte0(value) (value < 0) ? 0 : value
定义gte0(值)(值<0)?0:value 然后当我访问数组元素时,用这个宏包装表示索引的变量?在使用表示索引的变量访问数组元素之前,除了在代码中的每个位置手动执行边界检查外,是否还有一种标准做法

我正在寻找C或Objective-C中的任何解决方案


谢谢

在C中无法自动执行此操作。

索引需要
无符号int
NSUInteger
原语。然后,将保证您的值大于或等于零,最高可达
UINT_MAX
或任何
限制。h
定义,您只需检查上限。

需要小于零的项变为零的情况是什么?您可能需要重新考虑那里的代码。我建议您插入数组索引大于等于零的断言。我同意,最好的策略就是在代码中的该位置执行边界检查,以便清楚地了解发生了什么。谢谢,这没用。如果您以某种方式构建了一种将数组索引计算为负数的情况,那么假装它是未签名的仍然会导致大量问题。这就是为什么您要检查上界。这很公平。但这并不能真正回答OP的问题,即关于自动边界检查的问题。我认为应该可以编写一个宏或类别帮助器方法,它接受两个参数,数组指针和索引,并返回索引处的对象或nil。这将基本上用类似于-objectAtValidatedIndex:的内容替换-objectAtIndex:在任何情况下,如果您还没有将NSInteger与NSArray一起使用,那么现在可能是开始使用NSInteger的最佳时机。您可以转而捕获NSRangeException,作为处理错误索引的一种方法。查看NSArray文档。可能是因为他不喜欢这个事实:-)