是p2 == NULL和!* p2相同吗?

时间:2017-02-18 13:59:22

标签: c pointers null

以下是代码

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)相同?

为什么我会出现分段错误。

2 个答案:

答案 0 :(得分:6)

p2 == NULL!*p2不同。如果有的话,p2 == NULL相当于!p2

当您执行!*p2时,首先取消引用指针p2,然后检查值p2是否指向是“假的”。如果p2是空指针,则该解除引用将无效。

答案 1 :(得分:3)

它不一样。执行*p2时,它会从内存位置char中读取p2。如果p2恰好是NULL,则会导致细分错误,因为NULL(或0)没有合法的内存位置可供读取或写入。 p2 == NULL检查指针本身是否为NULL