我正在进行存储桶排序,将指向节点的指针排序到带有虚拟标头的链表中。用户输入节点的值,然后立即将它们放入适当的存储桶中。当我试图为链表的第二个节点(不包括虚拟标题)分配内存时,我的问题出现了。
这是用于将节点放入存储桶的代码,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);
}
使用跟踪语句,我发现在第二个节点的Malloc之前(与第一个节点具有相同的值),存储区的地址[值] - >接下来是正常地址,但之后地址为17。在我做的每一次测试中,这个值都达到了17。
任何帮助或想法都会很棒。谢谢你提前。
答案 0 :(得分:1)
我认为这是一个解决方案。
buckets[var] = (nodeptr) malloc(sizeof(*buckets[var]));
newNode= (nodeptr) malloc(sizeof(*newNode));
答案 1 :(得分:0)
您正在混合节点的结构和指向它的指针,从而覆盖内存位置。
由于你将malloc结果转换为nodeptr
类型,这意味着这是一个指针(因为malloc()返回一个指针),这也意味着你要分配一个指针大小的内存。
所以假设你命名了你的结构nodestruct
,要分配足够的内存你要写
newNode = (nodeptr) malloc(sizeof(struct nodestruct));
答案 2 :(得分:0)
以下内容可解决您的问题:
newNode =(nodeptr)malloc(sizeof(* nodeptr));
原因是nodeptr看起来是一个指向struct的指针,因此你应该为struct而不是指针分配内存。
从下一次请粘贴您的结构定义。