C 記憶體動態分配問題記錄

2021-10-04 21:07:23 字數 2761 閱讀 7722

刷題的時候,遇到關於鍊錶的操作,忘記給節點分配空間,導致錯誤。由於指標的使用頻率較低,思考良久,秉著實踐是檢驗真理的唯一標準的思想,整理一下關於記憶體動態分配的問題。

因為鍊錶中每乙個節點都是乙個指標,如果沒有給每乙個指標(節點)都申請空間的話,會導致每個指標(節點)都是一樣的位址,則會導致錯誤。

首先看如果沒有申請記憶體空間會導致的錯誤:

#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。教材...