strcmp说它有EXC\u BAD\u访问权限

strcmp说它有EXC\u BAD\u访问权限,c,exc-bad-access,C,Exc Bad Access,此循环将崩溃,并在XCode 4.6.2中给出EXC_BAD_访问错误 这是循环代码 for (beforeToDel = studentToChange->pFirstClass; (int)strcmp(beforeToDel->pNext->classId, className) == 0; beforeToDel = beforeToDel->pNext) {} 不同的变量具有以下值: 非常感谢你能给予的任何帮助 beforeT

此循环将崩溃,并在XCode 4.6.2中给出EXC_BAD_访问错误

这是循环代码

for (beforeToDel = studentToChange->pFirstClass; 
     (int)strcmp(beforeToDel->pNext->classId, className) == 0;
     beforeToDel = beforeToDel->pNext)
     {}
不同的变量具有以下值:


非常感谢你能给予的任何帮助

beforeToDel->pNext->pNext
NULL
。您的循环将在第二次迭代中崩溃,尝试间接通过该指针与
className
进行比较。在调用strcmp之前,您需要检查它

旁白:为什么类型转换为
int

  • 无需将
    strcmp
    的返回值强制转换为
    int
    。已经是一个了
  • 如果
    beforeToDel
    为空,或者
    beforeToDel->pNext
    为空,会发生什么情况?如果他们没有指向任何内容,那么他们就不能拥有
    classId
    pNext
    成员,对吗
  • 如果未包含
    ,则使用
    strcmp
    是错误的,因此请确保已包含该代码。我假定您正在查找要删除的节点链接,因此出现了相当尴尬的标识符“beforeToDel”。如果列表的头是要删除的节点,会发生什么情况?为什么不从指向
    studentToChange->pFirstClass
    的指针开始,在链接上迭代,而不是在节点上迭代?这将解决您的头部问题,同时使您的代码更加清晰

    我要这样声明我的链接列表:

    struct list {
        struct list *next;
        char class_name[];
    };
    
    声明一个指向
    pNext
    的类型。将其称为
    link
    ,因为此对象将存储指向代码将更新的链接的指针。将其初始化到列表的开头。这样,当第一次迭代结果匹配时,您就可以轻松地更改列表的标题。在我的功能中,我将返回新的头。您不需要在代码中这样做。只需确保
    link
    指向列表的开头(例如
    link=&studentToChange->pFirstClass;

    在每次迭代结束时,更新
    link
    以指向
    (*link)->next
    (或
    pNext
    ,在您的情况下)

    操作
    *链接
    ,而不是
    链接
    (例如
    strcmp(*link->classId,class\u name)==0
    )。找到要删除的节点后,使用
    *link=*link->next在其顶部进行分配或等效代码

    struct list *list_remove_class_name(struct list *head, char *class_name) {
        struct list **link = &head;
                                                      /* Did you mean != 0 here? */
        while (*link != NULL && strcmp(*link->class_name, class_name) == 0) {
            *link = *link->next;
        }
    
        struct list *node = *link;
        if (node != NULL) {
            *link = node->next;
        }
    
        free(node);
        return head;
    }
    

    在strcmp
    beforeToDel->pNext->pNext
    is
    null
    中使用beforeToDel之前,请先检查beforeToDel是否为null,但
    beforeToDel->pNext
    的地址不为null。。。至于typecast,我正在使用调试器,它希望我在打印之前将它转换为
    int
    ,所以我想我会尝试一下(这不会有什么坏处吧?),但我在发布它之前忘了将其取出是的,这是真的。你想说什么?它在第一次迭代后崩溃了。这就是为什么我如此困惑的原因,因为还有其他代码捕捉到了
    NULL
    异常。我仍然不明白-问题是在第一次迭代之后,您已经在todel
    之前将
    提升到下一个条目,循环条件检查将导致崩溃。我想我不明白为什么strcmp会在第一次迭代中崩溃,而
    beforeToDel->pNext->classId
    className
    相同,我以为它会返回一个零值,这就是我认为我的循环正在检查的值。