malloc用内存地址做了一些奇怪的事情

时间:2013-05-28 07:38:43

标签: c malloc

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

这是用于将节点放入存储桶的代码,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。

任何帮助或想法都会很棒。谢谢你提前。

3 个答案:

答案 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而不是指针分配内存。

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