如何验证参数是正数?

时间:2015-04-06 21:05:48

标签: c

虽然,我确实将函数原型定义为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)

2 个答案:

答案 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.