我有一个列表,列表中的每个节点都有一个字符*数据字段,该字段必须与节点本身进行混搭,但是当我尝试释放该数据时,控制台会停止,它不会崩溃,没有错误,什么都没有。但是,如果我将其注释掉并且仅释放列表节点,则可以正常工作。
我这样做对吗?
void removeSpecificData(List *list, char *course)
{
ListNodePtr currentNode = list->head;
ListNodePtr previousNode = NULL;
while (currentNode != NULL)
{
if (strcmp(currentNode->data, course) == 0)
{
ListNodePtr nodeToFree = currentNode;
if (previousNode == NULL)
{
list->head = currentNode->nextNode;
currentNode = list->head;
}
else
{
previousNode->nextNode = currentNode->nextNode;
currentNode = previousNode->nextNode;
}
printf("Free Data");
free(nodeToFree->data);
printf("Free Node");
free(nodeToFree);
}
else
{
previousNode = currentNode;
currentNode = currentNode->nextNode;
}
}
}
这是我的createListNode函数,以防有必要查看。
ListNodePtr createListNode(char *newCourse)
{
ListNodePtr newNode = (ListNodePtr)malloc(sizeof(struct ListNode));
newNode->data = (char *)malloc(sizeof(strlen(newCourse) + 1));
strcpy(newNode->data, newCourse);
newNode->nextNode = NULL;
return newNode;
}
提前谢谢。
以下行不正确。
newNode->data = (char *)malloc(sizeof(strlen(newCourse) + 1));
sizeof()
部分是不对的。如果字符串的长度大于 sizeof(size_t)
,则最终分配的内存少于所需内存。对strcpy
的调用将超出您分配的内存。因此,您的程序将具有未定义的行为。
用
newNode->data = malloc(strlen(newCourse) + 1);
请参阅我是否投射 malloc 的结果?
分配大小不正确。仅当尝试释放内存(损坏的内存列表(时,系统才会检测到它。
为什么不只是:
newNode->data = strdup(newCourse);
它将分配适当的大小(与您的尝试不同(并同时复制字符串(不需要malloc
和strcpy
(
对于初学者来说,函数removeSpecificData
至少有一个拼写错误或错误,因为没有声明变量nodeToFree
并且两个值都没有分配给变量。
所以这个说法
free(nodeToFree);
没有意义。
同样在这个 else 块中,第二个表达式语句没有意义。
else
{
previousNode->nextNode = currentNode->nextNode;
currentNode = previousNode->nextNode;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
功能太复杂了。它可以写得更简单。例如
void removeSpecificData(List *list, const char *course)
{
ListNodePtr *currentNode = &list->head;
while ( *currentNode != NULL && strcmp( ( *currentNode )->data, course) != 0 )
{
currentNode = &( *currentNode )->nextNode;
}
if ( *currentNode != NULL )
{
ListNodePtr tmp = *currentNode;
*currentNode = ( *currentNode )->nextNode;
free( tmp->data );
free( tmp );
}
}
至于函数createListNode
然后表达式
strlen(newCourse) + 1
类型为 size_t
。所以顺便说一下,表达式的值没有被计算:(
sizeof(strlen(newCourse) + 1)
等效于表达式
sizeof( size_t )
并且等于 4 或 8,具体取决于类型 size_t
的定义。
你不想写只是
newNode->data = (char *)malloc( strlen(newCourse) + 1 );