刷題的時候,遇到關於鍊錶的操作,忘記給節點分配空間,導致錯誤。由於指標的使用頻率較低,思考良久,秉著實踐是檢驗真理的唯一標準的思想,整理一下關於記憶體動態分配的問題。
因為鍊錶中每乙個節點都是乙個指標,如果沒有給每乙個指標(節點)都申請空間的話,會導致每個指標(節點)都是一樣的位址,則會導致錯誤。
首先看如果沒有申請記憶體空間會導致的錯誤:
#include
#include
using
namespace std;
struct listnode };
intmain()
cout <<
"l3 : "
;while
(head3 !=
null
&& n !=0)
return0;
}
我們的初衷是想建立九個節點並且給每個節點賦值。
但是輸出結果為:
0x7ffc4cc26850
10x7ffc4cc26850
20x7ffc4cc26850
30x7ffc4cc26850
40x7ffc4cc26850
50x7ffc4cc26850
60x7ffc4cc26850
70x7ffc4cc26850
80x7ffc4cc26850
9 l3 :
0x1dd1070
00x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
90x7ffc4cc26850
9
除了head3節點是正確的,後面賦值的節點以及節點指向的下乙個節點位址都是一樣的,說明在迴圈中,儘管節點指向的值每次會改變之外,定義的節點tmp並沒有申請新的記憶體來儲存。就會導致這個鍊錶錯誤。
正確姿勢
#include
#include
using
namespace std;
struct listnode };
intmain()
cout << endl;
for(
int i =
1; i <10;
++i)
cout << endl;
cout <<
"l1 : "
;int n =20;
while
(head1 !=
null
&& n !=0)
cout << endl;
cout <<
"l2 : "
;while
(head2 !=
null
&& n !=20)
return0;
}
使用new或者malloc(需要新增標頭檔案),但是在申請之後千萬不要用delete或者free釋放空間,因為這裡需要的就是分配空間,如果需要釋放,則需要在鍊錶中操作。
輸出位址顯真相
在輸出位址的時候發現
cout << l1 <<
" "<< l2 <<
" "<< l3 <<
" "<< head1 <<
" "<< head2 <<
" "<< head3 << endl;
cout << l1-
>next <<
" "<< l2-
>next <<
" "<< l3-
>next <<
" "<< head1-
>next <<
" "<< head2-
>next <<
" "<< head3-
>next << endl;
最開始的輸出為:
//輸出為
0x1dd1030
0x1dd1050
0x1dd1070
0x1dd1030
0x1dd1050
0x1dd107000
0000
每次申請的指標都會遞增20個位元組,然後就會發現,結構體中int佔4個位元組,listnode佔16個位元組。並且在後面動態的分配記憶體的時候也會發現依次遞增20個位元組。
在給三個鍊錶進行賦值操作之後輸出為:
//輸出為
0x1dd1190
0x1dd12b0
0x7ffc4cc26850
0x1dd1030
0x1dd1050
0x1dd107000
0x7ffc4cc26850
0x1dd1090
0x1dd11b0
0x7ffc4cc26850
通過這個也能發現,如果沒有分配記憶體,會導致鍊錶出現bug~ C語言動態分配記憶體問題
動態分配記憶體和直接分配記憶體區別 1.直接分配記憶體,如int p 是分配在棧上的,可以對其初始化 2.動態分配記憶體,int p malloc 100 是分配在堆記憶體上的 free 釋放記憶體問題 free函式只能對動態分配的記憶體進行釋放,釋放後該指標仍保留位址,但是記憶體被釋放,成為野指標...
記憶體動態分配
陣列的元素儲存於記憶體中連續的位置上。當乙個陣列被宣告時,它所需要的內存在編譯時就被分配。但是,你也可以使用動態記憶體分配在執行時為它分配記憶體。malloc所分配的是一塊連續的記憶體。例如,如果請求它分配100個位元組的記憶體,那麼它實際分配的記憶體就是100個連續的位元組,並不會分開位於兩塊或多...
動態分配記憶體
動態記憶體分配即分配記憶體大小在執行時才確定,一般在堆中分配。c語言動態記憶體分配相關的函式。include void malloc size t size malloc的使用比較直接,乙個成功的malloc呼叫返回分配的size大小的記憶體的指標。失敗時返回null並將錯誤 置為enomem。教材...