2017-05-16 6 views
-4

私はその後、私はCOUT、先頭のアドレスが完全に変更されたときに、見つけリストを生成し、なぜCoutはリストアドレスを変更するのですか?

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

でのvalを印刷したいです。

だから、

enter image description here

enter image description here

前 、誰もがこれを説明することができますTHX

+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あなたが正しいです、私は答えを変更しました。 –

関連する問題