realloc 使用和思考

2021-06-23 03:21:57 字數 946 閱讀 4665

realloc來自c語言的標準庫,函式簽名如下:

extern void*  realloc(void *, size_t);

這個函式用於重新分配指標位址對應的記憶體空間。第乙個引數,需要重新分配記憶體空間的指標。第二個,引數重新分配的記憶體空間大小。

特別之處在於,realloc在增加記憶體的情況下,就是size_t大於原有指標記憶體空間大小,首先會試圖去追加位址空間。比如:

char* p = malloc(100);

// 這裡會試圖在p位址記憶體空間後面追加乙個位元組空間

// 如果發現後面空間位址被使用

// 這時候才會重新分配記憶體空間

char* q = realloc(p, 101);

如果需要重新分配記憶體空間,就會把原有的資料拷貝過來,以後釋放原有空間。這時候返回的指標位址和原有的不同。但如果是追加,那麼返回指標位址和原有相同。

還有個特別之處在於,如果我realloc的大小比原有記憶體空間小怎麼辦,比如:

char* p = malloc(100);

char* q = realloc(p, 80);

這種情況下,p指標和q指標必定指向同一空間,只是對應記憶體空間會減小20個位元組。這個特性是我檢視msdn文件,和c99規範得出的結論。

需要注意的是,如果realloc失敗那麼將會返回null,所以這種情況下原指標位址空間還是需要自己維護的。

思考: 關於很多語言的動態陣列實現,一般的策略都是有個增長因子和增長閥值。當陣列長度到達閥值的時候,會動態增長一段記憶體。就是申請更大的記憶體位址,把原有的資料拷貝過去,銷毀原有的。那麼,看到realloc的特性之後,realloc總是會首先試圖追加記憶體空間,這就避免複製銷毀的開銷提高了效能。還能夠剪裁陣列記憶體,可以某些時候剪裁掉多餘的動態陣列空間,節省記憶體開銷。

realloc函 realloc函式使用規則

realloc函式使用規則如下 1 realloc失敗的時候,返回null 2 realloc失敗的時候,原來的記憶體不改變,不會釋放也不會移動 3 假如原來的記憶體後面還有足夠多剩餘記憶體的話,realloc的記憶體 原來的記憶體 剩餘記憶體,realloc還是返回原來記憶體的位址 假如原來的記憶...

realloc使用詳解

分析realloc invalid pointer 指標無效等錯誤!realloc函式用來為ptr重新分配大小為size的一塊記憶體,看似很簡單,在使用過程中卻會發生各種錯誤。函式形式為 void realloc void ptr,size t new size 最近在網上檢視了一些資料,在glib...

realloc使用詳解

分析realloc invalid pointer 指標無效等錯誤!realloc函式用來為ptr重新分配大小為size的一塊記憶體,看似很簡單,在使用過程中卻會發生各種錯誤。函式形式為 void realloc void ptr,size t new size 最近在網上檢視了一些資料,在glib...