假设我们有这段代码:
int *h;
for(int i=0;i<5;i++){
h = malloc(sizeof(int));
h[i] = i;
}
我在这里遇到的问题是我想从一个空数组开始,即只声明int *h
,然后*h
将在运行时使用{{{}增长1}}。我尝试使用此示例,但它不分配顺序内存位置,也不起作用。我理解realloc
在通过malloc分配之后有效,那么有没有解决方法呢?
答案 0 :(得分: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();
}