你敢看不敢看
问题如下
while (*T) //如果长度为n,只循环n-1次!!!
{
if(j==0||p[j-1]==p[i-1]) //如果这里这里j=0 , 那么p【-1】就已经溢出了,想请问下当电脑判断前面已经可以进入条件还会算后面的p[-1]么,就算不会这种代码有没有危险性?!
{
i++;
j++;
next[i]=j;
T++;
}
else
j=next[j];
}
}
[解决办法]
没有危险性,因为
[解决办法]
是任意条件为真整个表达式就为真,所以第一个为真时就不会判断第二个。同理&&第一个为假时,就不会判断第二个了。
比如,在链表里经常这样写if(p!=NULL&&p->value==value)类似的语句,但却不会写if(p->value == value && p!=NULL)一样。一旦判断到p为空了,那么整个表达式不可能成立,所以就不会判断后面的一句了。但反过来就不对了,p为空时,不能取p的value值,这是访问非法区域,触发段错误。