以下是代码
char* StrStr(const char *str, const char *target) {
if (!*target) return str;
char *p1 = (char*)str;
while (p1 != NULL) {
char *p1Begin = p1, *p2 = (char*)target;
while (*p1 && *p2 && *p1 == *p2) {
p1++;
p2++;
}
if (!*p2)
return p1Begin;
p1 = p1Begin + 1;
}
return NULL;
}
如果我使用if(p2 == null)而不是(!*p2),那么我会得到分段故障。为什么?
第14行http://codepad.org/zuqxvcj9
是(!*p2)与(p == null)?
相同为什么我会得到细分故障。
no p2 == NULL
与 !*p2
不同。如果有的话,p2 == NULL
等于!p2
。
进行!*p2
时,您首先 dereference 指针p2
,然后检查值 p2
是否为指向 to为" false"。如果p2
是一个无效的指针,则解除将无效。
不是相同的。当您执行*p2
时,它将从内存位置读取char
p2
指向。如果p2
恰好是NULL
,则会导致分割故障,因为NULL
(或0
)无需读取或写入法律内存位置。p2 == NULL
检查指针本身是否是NULL
。