为什么此代码的输出始终相同?

时间:2018-04-28 08:12:41

标签: c++ malloc

为什么我在c ++中的循环中得到相同的输出。

node* nn =  (struct node*)malloc(sizeof(struct node));      
for(int i=0;i<10;i++)
{

    node* n =  (struct node*)malloc(sizeof(struct node)); 
    cout<<&n<<endl;
    nn->next = n;
    nn =n;
}

3 个答案:

答案 0 :(得分:4)

因为你的n变量是循环体的局部变量,所以它在每次迭代开始时创建,并在每次迭代结束时销毁。

显然,编译器决定为n的每个版本重用相同的存储,这就是为什么它们都具有相同的内存地址。

请注意,&nn地址,而不是其内容。你甚至不必初始化它。您拨打malloc的电话无关紧要。

如果您想查看n的值,则需要删除&

答案 1 :(得分:1)

您正在输出&n n的地址,而不是n的内容,这可能是您想要的内容。

注意:问题是根据我的回答编辑的,但同样的问题仍然存在。

试试这个:

#include <iostream>
#include <cstdlib>

struct node {
    node* next;
};

int main() {
    node* nn =  (struct node*)malloc(sizeof(struct node));      
    nn->next=nullptr;//Initialise so we can clean up nicely...
    for(int i=0;i<10;i++)
    {

        node* n =  (struct node*)malloc(sizeof(struct node)); 
        n->next=nullptr;//Initialise so we can clean up nicely...
        std::cout<<&n<<"=="<<n<<std::endl;
        nn->next = n;
        nn =n;
    }
    //Clean up after ourselves. Not relevant to the question but good practice.
    while(nn!=nullptr){
        node*n=nn;
        free(nn);
        nn=n;
    }
    return 0;
}

典型输出:

0x7ffda1be2058==0x55ffb0b9fc20
0x7ffda1be2058==0x55ffb0ba0c50
0x7ffda1be2058==0x55ffb0ba0c70
0x7ffda1be2058==0x55ffb0ba0c90
0x7ffda1be2058==0x55ffb0ba0cb0
0x7ffda1be2058==0x55ffb0ba0cd0
0x7ffda1be2058==0x55ffb0ba0cf0
0x7ffda1be2058==0x55ffb0ba0d10
0x7ffda1be2058==0x55ffb0ba0d30
0x7ffda1be2058==0x55ffb0ba0d50

实际输出可能会有所不同,原则上每次迭代都不需要编译器将n存储在同一地址。我知道没有编译器没有。任何人吗?

注意:很少推荐在C ++中使用malloc()malloc()free()的直接替代是newdelete。在实践中使用std::unique_ptr<>或其他自我管理构造。

答案 2 :(得分:0)

这只是melpomeneanswer的补充,回应了评论:

  

如何创建n个节点?禁止使用向量,因此我创建了n个节点的链接链表,但问题是我无法在循环中创建n个节点。

实际上,你的代码没有你想象的那么错误,只是你错过了一个重点:

nn->next = n;

使用此说明,您丢失了最后一个nn指向的内容,并且您将无法重新获得它...

你需要的是第二个指向最初创建的元素的指针,所以你不会丢失列表头,因此不再丢失列表的其余部分:

node* nn = new node(); // this is the C++ way...
node* head = nn; // now you have a second pointer to the head... 

for(int i=0;i<10;i++)
/* [...] */

现在,您可以通过head指针访问您创建的所有节点(只要您不将其移离......)。

  

摆脱循环,只需使用struct * n = malloc(sizeof * n * 10); - David C. Rankin

另一种变体:直接创建10个元素...假设节点如下所示:

struct node
{
    Data data;
    node* next;
};

然后您只需

即可获得Data的10个元素
Data* allData = new Data[10]; // again using the C++ way...

C ++ aproach还有另一个优点:当调用默认构造函数时,数组中的元素已经初始化(对于基本数据类型,请参阅here)。