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