我有一个使用套接字设置的服务器/客户端。服务器不断侦听客户端消息。如果检测到特定消息,则应将一个节点添加到链接列表中。为了调试,我想打印出整个链表。
但是,只要我包含以下代码即可遍历列表:
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;
答案 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
。