2017-05-16 7 views
-4

나는 목록을 생성하고 cout을, 머리의 주소 변경 완전히왜 주 (CUT)가 목록 주소를 변경합니까?

#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; 
} 

그때 발견하여 발을 인쇄 할. ?

전에

enter image description here

enter image description here

그래서

후, 사람이 들으이 설명 할 수

+5

'geneate_list'는 함수의 지역 변수 (함수가 반환 된 후에 수명이 끝나는)의 주소를 반환하여 * 정의되지 않은 동작 *을 호출합니다. – UnholySheep

+4

다소 관련이 없지만 C++ 프로그램에서 왜'malloc'을 사용합니까? –

답변

1

generate_list 기능은 여러 가지 이유로 잘못 :

  1. 정의되지 않은 동작으로 생성되는 지역 변수의 주소를 반환합니다. Google 자세한 내용은 로컬 변수의 주소를 반환하십시오.
  2. 빈 벡터를 generate_list에 전달하면 새로 생성 된 머리글의 내용이 초기화되지 않습니다. 그러나 어쨌든 목록이 비어 있으면 어쨌든 머리를 쓸 수 없습니다. val에는 무엇이 포함됩니까? 따라서 generate_list은 빈 벡터에 대해 NULL을 반환해야합니다.
  3. 생성자와 함께 개체를 할당하는 데 malloc을 사용하고 있습니다. 따라서 ListNode의 생성자는 호출되지 않습니다 (비록이 생성자가 여기서는별로 유용하지 않지만).

당신이 뭔가를 원하는 :

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++에서는 이것을 다르게 할 것입니다.

+0

'malloc'을'new'로 변경하십시오. 'malloc'을 사용하여 사용자 정의 생성자로 객체를 생성 할 수 없습니다. –

+0

@ TadeuszKopec 네 말이 맞아, 나는 대답을 수정했다. –