C - malloc对内存地址做了一些奇怪的事情

  • 本文关键字:malloc 内存 地址 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);
} 

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

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

相关内容

  • 没有找到相关文章

最新更新