c ++ malloc()继续分配给相同的内存地址

时间:2013-05-23 13:41:05

标签: c++ pointers struct malloc

我正在尝试使用内存迭代创建“节点”。我的代码目前只是说它去了什么地址,并没有真正尝试在链表中建立链接。

以下是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

3 个答案:

答案 0 :(得分:3)

cout << &new_etc << endl;

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

cout << new_etc << endl;

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

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

答案 1 :(得分:1)

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

cout << &new_etc << endl;
        ^

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

修改后的问题: 请参阅此live code,其中显示了不同的地址。因此,您输出的内容与您向我们展示的代码无关。

答案 2 :(得分:1)

new_etc = (node*) malloc(sizeof(node));
...
free(new_etc);

如果malloc已经存在,为什么不能free下次返回同一个区块? 它应该是缓存中的热点,因此可能是最佳选择。

如果您没有free内存,,您可以修复日志记录,会发生什么?