C/C++ 區域性變數 和new 動態申請
阿新 • • 發佈:2019-01-03
下面一段c++程式
int i = 5;
cout << "dui_apply:" << endl;
while (--i){
int *dui_apply = new int;
cout << dui_apply << endl;
}
cout <<endl<< "stack_init:" << endl;
i = 5;
while (--i){
int stack_init = 1;
cout << &stack_init << endl;
}
程式輸出:
dui_apply:
030454D8
0304A6C0
0304E928
0304E968
stack_init:
00DCF744
00DCF744
00DCF744
00DCF744
使用int a=1這種方式編譯器是在程式執行前已經在棧中分配好一個int型名叫a的變數,無論int a=1;是否在迴圈內部,在資料棧中a一直都是那個地址對應的a,不會英文int a=1執行的多次就會佔用多個不同的記憶體,這點其實很容易理解。
但是,這樣一個簡單的問題,在做複製一個連結串列這個程式時,就栽了跟頭,在迴圈複製連結串列時,需要申請新的連結串列節點,而本人卻想當然的用了:
ListNode temp=ListNode();
申請一個新的節點,可笑啊!正確的做法當時是臨時申請記憶體:
point=new ListNode();
下面複製連結串列部分程式比較
//錯誤的程式,RandomListNode temp=RandomListNode(0);這種方式建立新節點顯然錯誤 while (node->next != nullptr){ //當前節點值為node的值 np->label = node->label; //跳到下一個node,準備複製 node = node->next; //新建一個新節點,錯誤的新建節點 RandomListNode temp=RandomListNode(0); //q=new RandomListNode(0); //cout << &temp << endl; //新節點的值為node的值 temp.label = node->label; //當前節點的下一個節點為新節點 np->next = &temp; //當前節點指標指向新節點 np = &temp; } //正確的做法,q=new RandomListNode(0);臨時申請記憶體,堆中 while (node->next != nullptr){ np->label = node->label; node = node->next; q=new RandomListNode(0); q->label = node->label; np->next = q; q->next = nullptr; np = q; }