realloc和malloc的注意事項
阿新 • • 發佈:2020-12-19
https://blog.csdn.net/snlying/article/details/4005238
這篇文章縫合了幾篇關於realloc和malloc的函式使用方法,之前自己也一直不太敢用realloc,現在對這篇文章進行一個提取。
realloc:
1.
int *p, *q; p = (int*)malloc(10); q = p; p = (int*)realloc(p,20);
這裡講一下realloc擴充記憶體的方式。realloc試圖在原有指標的後面直接擴充位元組,和一般人的思維一樣。因此有一種情況是realloc返回的指標和原來的指標一樣,所以第四行p = p。還有一種情況就是指標後面的位元組數不夠了,那麼realloc會在記憶體中再找一個地方,擴充記憶體,並且把原來的內容複製過來,同時原來的記憶體會釋放掉。因此在這種情況下,第四行p會和原來的地址不相同。這對於p來說沒什麼,照樣用,但是對於q,它指向的還是記憶體中的地址,所以如果操作q會有一些後果,所以最好直接把q賦值為NULL。
2.
int *p; p = (int*)malloc(10); p = (int*)realloc(p, 20);
這裡講一下realloc擴充記憶體失敗的情況。realloc失敗會返回NULL,有兩種情況,①p不為NULL,且size = 0,沒人會這樣做②如果需要擴充的記憶體不夠,那麼會返回一個NULL。這樣就可以看到上述程式碼的問題所在了,如果返回為NULL,且沒有儲存原來的地址,那麼原地址就沒了,就會有記憶體洩漏。所以就最好寫成上面那種程式碼形式,但是q賦值為NULL好了。