为什么cout会改变列表地址?

时间:2017-05-16 06:31:31

标签: c++ list cout

我想生成列表并按

打印val
#include<iostream>
#include<vector>
using namespace std;


/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct ListNode{
    int val;
    ListNode *next;
    ListNode(int x) :val(x), next(NULL){
    }
};
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {

    }
};

ListNode* geneate_list(vector<int> data){
    ListNode *p1, *p2;
    if (data.size() <= 0){
        p1 = (ListNode*)malloc(sizeof(ListNode));
        return p1;
    }
    /*ListNode *p1, *p2;*/
    ListNode head(data[0]);
    p2 = &head;
    for (int i = 1; i < data.size(); i++){
        p1 = (ListNode*)malloc(sizeof(ListNode));
        p1->val = data[i];
        p1->next = NULL;
        p2->next = p1;
        p2 = p1;
    }
    return &head;
}

int main(){
    vector<int> data = {1,2,3,4,5,6};
    ListNode* head = geneate_list(data);
    ListNode * g = head;

    while (head!=NULL){
        cout << head->val;
        head = head->next;
    }

    return 0;
}

然后我发现,当cout时,头部的地址完全改变了。 前

enter image description here

enter image description here

那么,任何人都可以解释这个吗?thx

1 个答案:

答案 0 :(得分:1)

generate_list函数错误有几个原因:

  1. 返回以未定义行为产生的局部变量的地址。 Google 返回本地变量的地址以获取更多详细信息。
  2. 如果将空向量传递给generate_list,则不会初始化新生成的列表的头部内容。但无论如何,因为列表是空的,无论如何你都不能有头脑。 val包含什么?因此generate_list必须为空向量返回NULL。
  3. 您正在使用malloc来分配带有构造函数的对象。因此,ListNode的构造函数永远不会被调用(虽然这个构造函数在这里不是很有用)。
  4. 你想要这样的东西:

    ListNode* geneate_list(vector<int> data) {
      ListNode *head = NULL;
      ListNode *previous = NULL;
    
      for (int i = 0; i < data.size(); i++) {
        ListNode *p = new ListNode(0);
    
        if (i == 0)
          head = p;
    
        p->val = data[i];
        p->next = NULL;
    
        if (previous)
          previous->next = p;
    
        previous = p;
      }
    
      return head;
    }
    

    免责声明:这或多或少是一个C函数尽可能接近原始函数。在C ++中,你会以不同的方式做到这一点。