我正在尝试使用内存迭代创建“节点”。我的代码目前只是说它去了什么地址,并没有真正尝试在链表中建立链接。
以下是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
答案 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
内存,和,您可以修复日志记录,会发生什么?