释放char*类型data字段失效问题咨询
老兄,你的问题根源首先是一个低级但致命的语法错误,再加上可能存在的内存管理逻辑漏洞,咱们一步步拆解:
1. 直接导致控制台无响应的元凶:死循环
你代码里的if (strcmp(currentNode->data, course) = ...)是赋值操作而非比较操作!strcmp的返回值会被直接赋值给条件表达式,只要两个字符串不相等(返回非0),这个条件就会永远为真,程序直接陷入死循环——这就是控制台卡住不动的原因!
立刻把它改成比较逻辑:
// 0表示两个字符串相等,这才是你要的判断逻辑 if (strcmp(currentNode->data, course) == 0)
2. 内存释放的潜在坑点(修复死循环后要排查)
解决死循环后,再检查data字段的分配与释放逻辑,这些问题也可能导致异常:
坑点1:直接赋值字符串字面量给
data
如果你是这么分配的:currentNode->data = "计算机基础"; // 错误:字面量存在只读内存区而不是正确的动态分配:
currentNode->data = malloc(strlen("计算机基础") + 1); // +1存终止符\0 strcpy(currentNode->data, "计算机基础");那么
free(currentNode->data)会触发未定义行为(因为你不能释放只读内存),表现可能就是无响应、崩溃或诡异的静默错误。坑点2:分配内存时忘记加1
字符串需要额外1字节存储\0终止符,如果只malloc(strlen(course)),会导致缓冲区溢出,破坏内存结构,后续free时必然出问题。坑点3:删除节点时的逻辑漏洞
找到目标节点后,必须先释放data,再处理链表指针,最后释放节点本身,否则会出现野指针或链表断裂:// 正确的释放顺序 free(currentNode->data); // 先释放数据 if (previousNode == NULL) { list->head = currentNode->next; // 处理头节点 } else { previousNode->next = currentNode->next; // 处理中间/尾节点 } free(currentNode); // 最后释放节点
修复后的完整示例片段
void removeSpecificData(List *list, char *course) { ListNodePtr currentNode = list->head; ListNodePtr previousNode = NULL; while (currentNode != NULL) { // 修复:用==判断字符串相等 if (strcmp(currentNode->data, course) == 0) { // 先释放动态分配的data free(currentNode->data); // 更新链表指针,避免断裂 if (previousNode == NULL) { list->head = currentNode->next; } else { previousNode->next = currentNode->next; } // 释放节点本身 free(currentNode); // 如果只需要删除第一个匹配项,这里break;要删所有就继续循环 break; } // 移动指针遍历下一个节点 previousNode = currentNode; currentNode = currentNode->next; } }
内容的提问来源于stack exchange,提问作者Grant Upson
相关产品推荐
相关产品推荐

