2015-11-07 193 views
2

假設我們有這樣的代碼:動態內存分配

int *h; 

for(int i=0;i<5;i++){ 
    h = malloc(sizeof(int)); 
    h[i] = i; 
} 

我這裏的問題是我要開始與空數組,即剛剛宣佈int *h,然後*h將增長運行時使用realloc。我試過使用這個例子,但它沒有分配一個連續的內存空間,也不起作用。我知道realloc工作分配malloc後有什麼解決方法嗎?

+0

這'H = malloc的(INT的sizeof)();用於''ħ只分配一個'int' – 101010

+0

你唯一分配空間[0]'和漏水先前'h' – amdixon

+2

指針不是數組! – Olaf

回答

2

爲了適應您正在嘗試做的事情,realloc(NULL, size)malloc(size)的功能完全相同。你可以寫你的循環是這樣的:

int *h = 0; 
size_t avail = 0; 

for (size_t i = 0; more_data_available(); i++) { 
    if ((i+1) * sizeof(int) > avail) { 
     avail = avail == 0 ? 8*sizeof(int) : avail*2; 
     int *nh = realloc(h, avail); 
     if (!nh) abort(); 
     h = nh; 
    } 
    h[i] = next_data_item(); 
} 

但需要注意的令人費解的?:表達我不得不使用放大avail。如果我在已經分配了一些空間的情況下啓動循環,那將會更加乾淨;然後我可以只使用malloc正常:

size_t avail = 8 * sizeof(int); 
int *h = malloc(avail); 
if (!h) abort(); 

for (size_t i = 0; more_data_available(); i++) { 
    if ((i+1) * sizeof(int) > avail) { 
     avail *= 2; 
     int *nh = realloc(h, avail); 
     if (!nh) abort(); 
     h = nh; 
    } 
    h[i] = next_data_item(); 
} 
+0

謝謝..但它似乎不清楚我 – Mike

+0

謝謝。我知道了 – Mike

+0

我可以問另一個問題:我如何確定h的大小?我的意思是當**我想在h **中搜索一個元素時,我需要h的大小來遍歷它,對吧? – Mike