虽然,我确实将函数原型定义为size_t
类型,这是一种无符号类型。我发现我仍然可以将负数传递给函数,但输出将是一个大的有符号十进制数。我问这个的原因是因为我想验证一个已知数组容量的数组索引。
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
void print(size_t i)
{
printf("%zu\n", i);
}
int main()
{
print(-1);
return 0;
}
输出:
18446744073709551615
是否可以验证size_t i
变量是否大于0?如果是这样我怎么能这样做? gcc不喜欢我检查i >= 0
,因为它说i
永远不会小于零。
编辑:
进一步说明。想象一下,您必须验证,而不是将任意小数传递给函数以获取索引i处的元素。我想确保传入的索引在边界内。该边界是:[0,N)
答案 0 :(得分:6)
C类型的推广系统,结合参数类型为size_t
这一无符号类型的事实,排除了从函数内部检测错误用法的任何方法。但是,您可以通过宏从外部检测到它:
#define print(x) do { if ((x)<0) { /* error */ } else print(x); } while(0)
或类似。
答案 1 :(得分:0)
你实际上是在寻求一个合理的&#34;数字检查而不是负数检查(18446744073709551615确实是正面的)。
我可以建议将大小与某些任意限制进行比较,例如4 TB(4,398,046,511,104)(如果确实是内存大小)。
如果您确实要检查负数,请在gcc中转换为ssize_t
,然后比较为0.