我正在做一个桶排序,将指向节点的指针排序到一个带有虚拟头的链表中。用户输入节点的值,然后它们立即被放入相应的桶中。当我试图为链表的第二个节点(不包括虚拟头)分配内存时,我的问题出现了。
这是用于将节点放入桶中的代码,var是要排序的值,current是要排序的新创建的节点:
void bucketSort(int var, nodeptr current)
if(!bucket[var])
{
buckets[var] = (nodeptr) malloc(sizeof(nodeptr));
buckets[var]->next = current;
bucketrear[var] = current;
}
else
{
bucketrear[var]->next = current;
bucketrear[var] = current;
}
}
这是用于创建新节点的代码的简化版本(较少的值):
void addNode(int value)
{
nodeptr newNode;
newNode= (nodeptr) malloc(sizeof(nodeptr));
newNode->value = value;
newNode->next = NULL;
bucketDrop(value, newNode);
}
使用Trace语句,我发现在第二个节点(与第一个节点具有相同的值)的Malloc之前,桶[value]->next的地址是一个正常地址,但之后的地址是17。这个值17在我做的每一个测试中都会出现。
任何帮助或想法将是伟大的。
我认为这是一个解决方案。
buckets[var] = (nodeptr) malloc(sizeof(*buckets[var]));
newNode= (nodeptr) malloc(sizeof(*newNode));
您混淆了节点的结构体和指向它的指针,从而覆盖了内存位置。
由于您正在将malloc结果转换为nodeptr
类型,这意味着这是一个指针(因为malloc()返回一个指针),这也意味着您正在分配指针大小的内存。
如果你将你的结构体命名为nodestruct
,为了分配足够的内存,你会写
newNode = (nodeptr) malloc(sizeof(struct nodestruct));
以下应该可以解决您的问题:
newNode= (nodeptr) malloc(sizeof(*nodeptr));
原因是nodeptr看起来是一个指向struct的指针,因此你应该为struct而不是指针分配内存。
从,下次请粘贴您的结构定义也