【问题标题】:c++ malloc() keeps assigning to same memory addressc++ malloc() 不断分配给相同的内存地址
【发布时间】:2013-05-23 13:41:04
【问题描述】:

我正在尝试使用内存迭代地创建“节点”。我的代码目前只是说明了它的地址,实际上并没有尝试在链接列表中创建链接。

这是node 的代码:

struct node {
  int num;
  node *next;
};

这是malloc()的代码

node *etc = (node*) malloc(sizeof(node));
etc->num = 1;
etc->next = NULL;
cout << etc << endl;

for (int i=2; i<=10; i++) {
  node *new_etc;
  new_etc = (node*) malloc(sizeof(node));
  cout << new_etc << endl;
}

编辑

输出:

0xcff010
0xcff030
0xcff050
0xcff070
0xcff090
0xcff0b0
0xcff0d0
0xcff0f0
0xcff110
0xcff130

【问题讨论】:

  • 为什么这个标签是 C++?
  • 问题是什么?
  • @JohnDibling: cout 符合 C++ 标准,甚至是有史以来最程序化的代码。 :)
  • 使用new/delete,而不是malloc/free。或者写普通的 C。
  • @MatteoItalia:啊,是的,没看到cout,只看到了malloc

标签: c++ pointers struct malloc


【解决方案1】:
cout << &new_etc << endl;

这里打印的是变量new_etc 的地址,即存储指针 的内存位置,而不是它指向的地址。你想要的是:

cout << new_etc << endl;

您在哪里打印new_etc内容,即malloc 返回的地址。

现在,由于您在每次迭代后都在 free 处理此内存,因此您可能会获得不同的地址以及相同的地址 - 毕竟,如果您释放了过去 malloc 给您的内存,这意味着可以重复使用。

【讨论】:

  • 嗯,OP frees 记录后立即内存,所以 malloc 将完全有理由下次再次返回相同的块。
  • 好的,我删除了free()。但什么都没有改变。
  • @JShoe:要么你没有删除&amp;,要么你没有删除free(或者简单地说,你删除了它们但没有重新编译)。如您所见,例如here,地址不同。
【解决方案2】:
new_etc = (node*) malloc(sizeof(node));
...
free(new_etc);

如果你已经freed 了,为什么不应该 malloc 下一轮返回相同的块? 它应该在缓存中很热,因此可能是最佳选择。

如果你不free 内存,并且你修复你的日志记录,会发生什么?

【讨论】:

  • 好的,我删除了free()。但什么都没有改变。
  • 所以你修复了free logging,编译代码完全如你编辑的问题所示,仍然得到同样的输出?
  • 对不起。我对问题进行了更改,而不是我的代码。你是对的,现在它可以工作了。谢谢。
  • “它有效”的含义让我很困惑,以前什么不起作用...?
【解决方案3】:

要打印指针的地址,请删除&amp;

cout << &new_etc << endl;
        ^

它打印指针new_etc 的地址,而不是new_etc 指向的地址。 new_etc的地址是相同的,分配指针后不会改变。

编辑后的问题: 看到这个live code,它显示了不同的地址。因此,您的输出与您向我们展示的代码无关。

【讨论】:

    猜你喜欢
    • 2014-11-27
    • 2018-08-03
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2014-08-06
    相关资源
    最近更新 更多