看板 C_and_CPP 關於我們 聯絡資訊
請問 realloc 之後,之前已存資料的記憶體位置改變是正常的嗎? 我寫了個簡單的測試程式如下,在 Linux 和 windows 上跑的結果不一樣, int main(){ int i; int * p = calloc(10, sizeof(int)); for(i=0;i<10;i++) p[i]=i; int * p2 = realloc(pm, sizeof(int) * 20) ..... p2[0] = -1; ..... } 在 Linux 上,p 和 p2 指的記憶體空間一樣 ( p2[0] = p[0] = -1 ) 而在 windows 上就不一樣,怎麼會這樣呢? ( p[0] = 0 ; p2[0] = -1 ) 那在 windows 上的 p 所指的空間要另外 free 嗎? 還是 realloc 的時候程式就會自己釋放記憶體該空間? ==================================================================== 我主要之目的是在 main() 裡宣告一 memory pool, 給我要實作的資料結構用,這些接構本身都是用數個指標串在一起, 當 input 的量太大時,再用 realloc 增加空間, 但是若前面已經有資料的記憶體位置更動,那我整個結構就 ... 毀掉了 ... (目前就是有這樣的問題存在 ... ) 而我這隻程式又主要在 windows 上跑,請問大大們建議用什麼方法解決呢? 還是說 memory pool 不是這樣用的? 我對此概念有所誤解呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.18.7
VictorTom:realloc/ 自己接起來; 簡單說, 換adddress是正常的, 然 07/14 23:55
VictorTom:後不用自己free; 話說, 都自己link了, 新的資料往後串下 07/14 23:56
VictorTom:去就好, 為什麼會搞到要realloc, 然後整個list爛掉呢?_? 07/14 23:56
henry035:因為我想練習用 memory pool,看來我好像不應該這樣搞 07/14 23:58
henry035:那位麼 Linux 上就不會換 address 呢? 07/14 23:59
henry035:而我參考的書籍也是寫,realloc會直接在後面要記憶體 @@ 07/15 00:00
ledia:運氣好不好的問題, 無論 win or linux 都沒有保證會拿到原本 07/15 00:03
ledia:的那個位址, 詳細看看 manpage 就知道了 07/15 00:03
ledia:如果位置有變, 舊的那個 realloc 會幫你 free 掉 07/15 00:05
henry035:了解~ 謝謝兩位大大的說明 07/15 00:06
henry035:那「realloc 只適用在陣列結構」這個想法對嗎? 07/15 00:08
VictorTom:你的問題頗籠統, realloc適合用在它適合的地方....~_~ 07/15 00:09
VictorTom:問題在我不明白你的memory pool到底是什麼東西, 如果你 07/15 00:09
VictorTom:是想練習自己開一大塊mem然後自己管理/分配這個空間, 那 07/15 00:10
VictorTom:麼除了一開始malloc一大塊回來與最後完整的還掉以外, 07/15 00:10
VictorTom:中間對這快memory的操作就不應該再用到內建的mem管理函 07/15 00:11
VictorTom:數; 而是自己建表管理這整塊mem, 自己寫ALLOC/FREE出來. 07/15 00:12
VictorTom:如果你的mem pool不是這個意思, 請無視小弟上面的推文:) 07/15 00:13
henry035:大大,就是您的意思,太感謝您的解說了,我大概知道方向 07/15 00:15
henry035:了,謝謝。 07/15 00:15