如何根据数组的大小重新分配?

时间:2015-01-26 22:16:40

标签: c arrays pointers realloc

假设malloc有足够的内存空间来容纳一个大小为20的数组。程序正在运行,现在我需要足够的内存来处理大小为40的数组。我尝试使用realloc这样做,但它似乎没有工作。我的代码是以下(我试图找到低于400万的所有偶数斐波纳契项的总和):

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv){
    int i,sum,size;
    int *fibo;

    size = 20; //initial size of array
    fibo = (int *) malloc(size*sizeof(int));
    fibo[0]=1;
    fibo[1]=1;
    i=2;
    sum=0;

    while(fibo[i-1]<4000000){
            fibo[i] = fibo[i-1]+fibo[i-2];
            printf("fibo[%d] = %d\n", i, fibo[i]);
            if(fibo[i]%2 == 0){
                    sum+= fibo[i];
            }
            i++;
            if(i>size){
                    fibo = (int *) realloc(fibo, (size *= 2)*sizeof(int));
            }
    }

    printf("Sum = %d\n", sum);
    return 0;

}

任何人都知道为什么realloc失败了,我该如何修复它?

1 个答案:

答案 0 :(得分:2)

在最后一次迭代中,i等于20但表达式

if(i>size)

是假的,所以你实际上并没有使用realloc,而是写入

fibo[20]

程序正在访问不属于它的部分内存。将表达式更改为

if(i>=size)

应该解决它:)