free()后程序崩溃问题

昨天写了一段关于不带头结点的单链表的操作代码,其中只要遇到free()函数,程序就崩溃,cmd.exe一直无法关闭,只有等重启之后才能关闭

找了一段时间原因,终于让我找到了,我估计所有出现free后程序崩掉的原因就是这个,内存溢出或者说内存分配出现了问题

先上源码:

PSListNode BuyNode ( PSListNode *p )
{
    *p = (PSListNode*)malloc(sizeof(PSListNode));
    if ( *p == NULL )
    {
        return NULL;
    }
    return *p;
}
void PopBack(PSListNode* pSList)
{
    PSListNode q;
    PSListNode pList, pTemp;
    (pList) = *pSList;
    if ((pList) == NULL)
    {
        printf("链表为空,删除失败\n");
        return;
    }
    else
    {
        pTemp = pList;
        while ((pTemp)->next->next != NULL) { (pTemp) = (pTemp)->next;
        }
        q = pTemp->next;
        pTemp->next = NULL;
        free(q);    
            }
    *pSList = pList;
}

以上就是出错代码~
大家能找出问题吗。。。
没错!
看BuyNode函数!
malloc(sizeof(PSListNode))…
PSListNode是链表节点的指针啊!就是* SListNode
sizeof(PSListNode) = 4,而不等于链表节点的大小!
在这个程序中,每次我们分配一个4字节的大小给节点,但在下面赋值的时候有超过了4字节,当我们free的时候,给free函数一个指针,但是在内存中已经乱了,不是我们想要的地址了,那个时候我们free掉的不是我们想要free的节点,而是不知道什么东西让我们free了,这个时候肯定会发生错误!

找出这个错误真是不容易。。。因为单步调式的时候,malloc那一块是不报错的。。

你可能感兴趣的:(malloc,单链表,内存分配)