2010-10-06 36 views
0

這是一個面試問題。 如果您使用malloc獲得一塊內存,如:malloc後,如何獲得更多的內存仍然是連續的?

char *p = (char *) malloc (100); 

現在,你發現你需要更多的內存,說130如何獲取內存,使得內存的新片仍是連續

+4

他們大概的意思你使用'realloc'。不過,這個問題有點含糊,也許是因爲他們不希望問題的答案太明顯。或者因爲他們不擅長提問。我可以說,免費(p); p = malloc(130);'給我一個新的內存塊,大小爲130字節,並且是連續的(當然,失敗時是空指針)。 – 2010-10-06 16:59:47

回答

9
ptmp = realloc(p, 130); 
if (ptmp == NULL) 
    handle_out_memory_condition(); 
p = ptmp; 

可替換地:

p = realloc(p, 130); 
if (p == NULL) 
    abort(); 

注意p可以具有新的值,這取決於需要被移動的內容是否找到的連續塊新的尺寸。

文檔:http://opengroup.org/onlinepubs/007908775/xsh/realloc.html

+3

如果realloc失敗,則會泄漏前面指向的100個字節'p'。 'realloc'給一個臨時變量,測試,如果ok分配給原始變量 – pmg 2010-10-06 17:11:54

+2

'p = realloc(p,130)'是不好的形式。您應該始終將'realloc'的結果存儲在臨時值中,以確保其成功。否則,你可能會失去原始指針和內存泄漏。 – jamesdlin 2010-10-06 17:13:25

+0

@pmg,@jamesdlin:我已經更新了我的答案。 – 2010-10-06 17:17:09

0

從所有明顯reallocmalloc答案Appart酒店,如果您使用MSVC,你可以使用_expand,這將嘗試調整塊,沒有移動它

+0

所以將realloc()與高質量的實現。換句話說,幾乎總是。 – Darron 2010-10-06 18:02:57

+1

'realloc'也會嘗試調整塊的大小而不移動。不同之處在於,如果無法移動塊無法調整大小,它們的行爲將如何。 '_expand'將失敗。 'realloc'會移動它。 – 2010-10-06 18:29:25

+0

高質量的實現可能會在其自己的區域中爲每個可能大小的塊分配專用於特定大小對象的塊,並且永遠不可能實現就地調整大小。在許多工作負載下,這可能是最佳的。它可能對線程特別有效,因爲您可以避免嘗試拆分/合併空閒塊的鎖爭用。 – 2010-10-06 18:46:59