检查Null指针是否在C中不起作用(给出SegFault错误)

Maa*_*aaz 2 c pointers segmentation-fault

所以我正在检查NULL指针/空字符串,如果找到任何一个,则返回0.但是,我似乎Segmentation Fault在其中一个编译器中遇到错误.如果有人能帮助我找出可能导致它的原因.显然,当empty stringsnull pointers被用作输入的错误出现.但是,这个错误不会出现在我正在使用的编译器中,而是出现在另一个编译器中(我正在评估的编译器).

rpsls.c

#include <string.h>

int rpsls(const char *player1, const char *player2)
{

    if (*player1 == '\0' || *player2 == '\0' || player1 == NULL || player2 == NULL || strcmp(player1, player2) == 0)
        return 0;

    char *r = "rock";
    char *p = "paper";
    char *si = "scissors";
    char *l = "lizard";
    char *s = "Spock";



    if (!strcmp(player1, r) && !strcmp(player2, si))
        return 1;
    else if (!strcmp(player1, p) && !strcmp(player2, r))
        return 1;
    else if (!strcmp(player1, si) && !strcmp(player2, p))
        return 1;
    else if (!strcmp(player1, l) && !strcmp(player2, s))
        return 1;
    else if (!strcmp(player1, s) && !strcmp(player2, si))
        return 1;
    else if (!strcmp(player1, r) && !strcmp(player2, l))
        return 1;
    else if (!strcmp(player1, p) && !strcmp(player2, s))
        return 1;
    else if (!strcmp(player1, si) && !strcmp(player2, l))
        return 1;
    else if (!strcmp(player1, l) && !strcmp(player2, p))
        return 1;
    else if (!strcmp(player1, s) && !strcmp(player2, r))
        return 1;

    if (!strcmp(player2, r) && !strcmp(player1, si))
        return -1;
    else if (!strcmp(player2, p) && !strcmp(player1, r))
        return -1;
    else if (!strcmp(player2, si) && !strcmp(player1, p))
        return -1;
    else if (!strcmp(player2, l) && !strcmp(player1, s))
        return -1;
    else if (!strcmp(player2, s) && !strcmp(player1, si))
        return -1;
    else if (!strcmp(player2, r) && !strcmp(player1, l))
        return -1;
    else if (!strcmp(player2, p) && !strcmp(player1, s))
        return -1;
    else if (!strcmp(player2, si) && !strcmp(player1, l))
        return -1;
    else if (!strcmp(player2, l) && !strcmp(player1, p))
        return -1;
    else if (!strcmp(player2, s) && !strcmp(player1, r))
        return -1;

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

main.c

#include <stdio.h>

int rpsls(const char *player1, const char *player2);

int main (void)
{
  printf ("%d\n", rpsls("rock","paper"));
  printf ("%d\n", rpsls("rock","rock"));
  printf ("%d\n", rpsls("paper","rock"));
  printf ("%d\n", rpsls("lizard",(char*)0));
  printf ("%d\n", rpsls("",(char*)0));

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

sim*_*onc 6

使用逻辑OR运算符从左到右计算表达式

if (*player1 == '\0' || *player2 == '\0' ||
    player1 == NULL || player2 == NULL ||
    strcmp(player1, player2) == 0)
Run Code Online (Sandbox Code Playgroud)

NULL*player1 == '\0'测试前取消引用player1 == NULL.

*player1==NULL相当于player1[0]==NULL.如果player1指向您未分配的内存,则尝试读取此内存的效果未定义.此时任何事情都可能发生.在您的本地测试中,您报告这似乎有效(我对此持怀疑态度); 在您老师的测试中,您的程序无权读取地址0和段错误.

您需要重新排序表达式

if (player1 == NULL || *player1 == '\0' ||
    player2 == NULL || *player2 == '\0' ||
    strcmp(player1, player2) == 0)
Run Code Online (Sandbox Code Playgroud)

  • @Maaz我已经更新了我的答案,更详细地解释了解除引用NULL意味着什么以及它为什么不好. (2认同)