假设我们有这个代码:

 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();
}

10-06 00:47