if( (*ptr != ',') || strlen(ptr+1) < sizeof(struct A) * num1)
{
printf("\n Condition satisfied.");
}
这是有问题的代码。我有一个格式为str =&#34; -1,ABCDEFGH&#34;的字符串,以及一个大小为15字节的结构A.
我事先执行此操作:
number = strtoul(str, &ptr, 10);
在此操作之后,ptr指向&#39;,&#39;和数字= -1
查看IF条件,第一个语句的计算结果为false(因为* ptr =&#39;,&#39;)并且第二个语句执行为TRUE,即使它应该为false(strlen(ptr +) 1)是正的,并且(sizeof(struct A)* number)是负的,因为num1是负值)。
为什么此语句评估为真并进入IF块?我得到输出条件满意&#39;而我不应该。提前谢谢。
答案 0 :(得分:4)
(sizeof(struct A) * number)
是否定的,只是因为num1
是负值
不完全。 sizeof(struct A)
的类型为size_t
(无符号类型)。
假设
num
的类型为int
,size_t
对应的签名类型的精度与int
的精度相同或更大, sizeof(struct A) * num
是无符号值(因此非负数),即使num
为负数。
否则,如果无符号操作数的转换等级大于或等于带符号操作数的转换等级,则带符号操作数将转换为无符号操作数的类型。
请注意,在 @ user3386109 发表评论时,strlen
也使用了无符号类型。因此<
和*
可能会出现同样的问题。
答案 1 :(得分:-1)
sizeof(struct A)未定义,并且还乘以一个数字,因此它提供了