c - 释放字符*数据不起作用



我有一个列表,列表中的每个节点都有一个字符*数据字段,该字段必须与节点本身进行混搭,但是当我尝试释放该数据时,控制台会停止,它不会崩溃,没有错误,什么都没有。但是,如果我将其注释掉并且仅释放列表节点,则可以正常工作。

我这样做对吗?

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);

它将分配适当的大小(与您的尝试不同(并同时复制字符串(不需要mallocstrcpy(

对于初学者来说,函数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 );

最新更新