运行错误代码之前进行段错误

时间:2018-11-30 09:06:46

标签: c

我有一个使用套接字设置的服务器/客户端。服务器不断侦听客户端消息。如果检测到特定消息,则应将一个节点添加到链接列表中。为了调试,我想打印出整个链表。

但是,只要我包含以下代码即可遍历列表:

if( listHead )
            {
                Node * searcherNode = (Node*)malloc(sizeof(Node));
                searcherNode = listHead;
                while( searcherNode->next != NULL )
                {
                    printf( "Account name i: %s\n", searcherNode->accountData.name );
                    searcherNode = searcherNode->next;
                }
                free( searcherNode );
            }

一旦发送任何消息,它就会开始出现段错误,而不仅仅是运行此代码的消息。在此循环之前的调试printf不会显示或显示任何内容,因此它会在代码的早期发生。

运行if(searcherNode-> next!= NULL)不会引起任何错误,也不会运行searcherNode = searcherNode-> next;他们自己。另外,将while语句更改为

while( searcherNode != NULL )

也没有帮助。

有什么想法为什么会发生这种段错误?非常感谢!

编辑:与此代码相同的问题:

Node * searcherNode = listHead;
                while( searcherNode != NULL )
                {
                    printf( "Account name i: %s\n", searcherNode->accountData.name );
                    searcherNode = searcherNode->next;
                }

头文件中定义的结构:

typedef struct bigNode
{
    struct bigNode *next;
    BankAccount accountData;  
} Node;

主文件中的相关代码:

Node *listHead = NULL; //in global declarations

节点创建:

Node * nodeBuilder;
nodeBuilder->accountData = accountBuilder;
nodeBuilder->next = listHead;

listHead = nodeBuilder;

1 个答案:

答案 0 :(得分:0)

首先,您是shouldn't really cast the result of malloc。其次,malloc会导致内存泄漏,因为您立即使指针变量searcherNode指向其他位置。

重新分配可能是导致程序崩溃的原因:由于searcherNode不会指向用malloc分配的内存,因此对free的调用将尝试释放一些不应该被释放。实际上,这将尝试释放列表中的最后一个节点,而不将其从列表中删除。

如果未为最后一个节点的内存分配malloc,则无法将指针传递到free,因为这将导致undefined behavior。如果为内存分配了malloc,那么您下一次尝试取消引用最后一个节点(现在已释放)的尝试也会导致undefined behavior

简单的解决方案:请勿致电malloc,最重要的是请勿致电free


您做什么

Node * searcherNode = malloc(sizeof(Node));
searcherNode = listHead;

在某种程度上类似于

int myValue = 10;
myValue = 5;

然后想知道为什么myValue不等于10