以下是代码
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)而不是if(!* p2)那么我会得到分段错误。为什么呢?
第14行http://codepad.org/ZUqXVCJ9
if(!* p2)是否与if(p == NULL)相同?
为什么我会出现分段错误。
答案 0 :(得分:6)
否p2 == NULL
与!*p2
不同。如果有的话,p2 == NULL
相当于!p2
。
当您执行!*p2
时,首先取消引用指针p2
,然后检查值p2
是否指向是“假的”。如果p2
是空指针,则该解除引用将无效。
答案 1 :(得分:3)
它不一样。执行*p2
时,它会从内存位置char
中读取p2
。如果p2
恰好是NULL
,则会导致细分错误,因为NULL
(或0
)没有合法的内存位置可供读取或写入。 p2 == NULL
检查指针本身是否为NULL
。