假設我們有這樣的代碼:動態內存分配
int *h;
for(int i=0;i<5;i++){
h = malloc(sizeof(int));
h[i] = i;
}
我這裏的問題是我要開始與空數組,即剛剛宣佈int *h
,然後*h
將增長運行時使用realloc
。我試過使用這個例子,但它沒有分配一個連續的內存空間,也不起作用。我知道realloc
工作分配malloc後有什麼解決方法嗎?
假設我們有這樣的代碼:動態內存分配
int *h;
for(int i=0;i<5;i++){
h = malloc(sizeof(int));
h[i] = i;
}
我這裏的問題是我要開始與空數組,即剛剛宣佈int *h
,然後*h
將增長運行時使用realloc
。我試過使用這個例子,但它沒有分配一個連續的內存空間,也不起作用。我知道realloc
工作分配malloc後有什麼解決方法嗎?
爲了適應您正在嘗試做的事情,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();
}
這'H = malloc的(INT的sizeof)();用於''ħ只分配一個'int' – 101010
你唯一分配空間[0]'和漏水先前'h' – amdixon
指針不是數組! – Olaf