0

我正在做一个桶排序,将指向节点的指针排序到一个带有虚拟标题的链表中。用户输入节点的值,然后立即将它们放入相应的存储桶中。当我尝试为链表的第二个节点(不包括虚拟标头)分配内存时,出现了我的问题。

这是用于将节点放入桶中的代码,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 Statements 发现,在第二个 Node 的 Malloc 之前(与第一个相同的值),bucket[value]->next 的地址是正常地址,但之后地址是 17。这个值为 17在我做的每一个测试中都出现了。

任何帮助或想法都会很棒。先感谢您。

4

3 回答 3

1

我认为这是解决方案之一。

buckets[var] = (nodeptr) malloc(sizeof(*buckets[var]));

newNode= (nodeptr) malloc(sizeof(*newNode));
于 2013-05-28T08:22:05.943 回答
0

以下应该可以解决您的问题:

newNode= (nodeptr) malloc(sizeof(*nodeptr));

原因是 nodeptr 看起来是指向结构的指针,因此您应该为结构分配内存而不是指针。

从,下次请也粘贴您的结构定义。

于 2013-05-28T17:49:56.887 回答
0

您正在混淆节点的结构和指向它的指针,从而覆盖内存位置。

由于您将 malloc 结果转换为一种nodeptr类型,这意味着这是一个指针(因为 malloc() 返回一个指针),这也意味着您正在分配指针大小的内存。

因此,鉴于您命名了 struct nodestruct,以分配足够的内存来编写

newNode = (nodeptr) malloc(sizeof(struct nodestruct));
于 2013-05-28T08:13:31.563 回答