0
if( (*ptr != ',') || strlen(ptr+1) < sizeof(struct A) * num1)
{
    printf("\n Condition satisfied.");
}

这是有问题的代码。我有一个格式为 str = "-1,ABCDEFGH" 的字符串和一个大小为 15 字节的结构 A。

我正在预先执行此操作:

number = strtoul(str, &ptr, 10);

此操作后,ptr 指向 ',' 和 number = -1

查看 IF 条件,第一个语句的计算结果为假(因为 *ptr = ','),第二个语句执行为 TRUE,即使它应该为假( strlen(ptr+1) 为正,并且 (sizeof( struct A) * number) 是负数,仅仅是因为 num1 是负值)。

为什么此语句评估为真并进入 IF 块?我得到了输出“条件满足”,而我不应该。提前致谢。

4

2 回答 2

4

(sizeof(struct A) * number)是负数,仅仅因为num1是负值

不完全的。sizeof(struct A)有类型size_t(无符号类型)。

假如说

  • num是类型int
  • 有符号类型的精度,对应size_t等于或大于 的精度int

sizeof(struct A) * num是一个无符号值(因此是非负数),即使num是负数。

请参阅算术运算符

否则,如果无符号操作数的转换等级大于或等于有符号操作数的转换等级,则将有符号操作数转换为无符号操作数的类型。

请注意,正如@user3386109评论的那样,它也strlen使用无符号类型。因此,与<as with可能存在相同的问题*

于 2015-09-12T02:12:18.557 回答
-2

sizeof(struct A) 是未定义的,它也乘以一个数字,因此它提供了一个

于 2015-09-12T02:16:01.553 回答