1. 程式人生 > >C/C++ 區域性變數 和new 動態申請

C/C++ 區域性變數 和new 動態申請

下面一段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;
}