为什么realloc每次都失败?

时间:2017-05-07 17:53:53

标签: c arrays dynamic

我的代码有问题。 malloc工作,在while循环中,realloc()第一次工作,第二次调用时,它总是失败。 该代码是获取数字素因子的算法的一部分。

int main()
{
    int n, in, *ar, len = 0;
    scanf("%d", &n);
    ar = (int *) malloc(1 * sizeof(int));
    while(n % 2 == 0){
        ar[len] = 2;
        len++;
        ar = (int *) realloc(ar, len * sizeof(int));
        if(ar == NULL){
            printf("Error");
            return 1;
        }
        n /= 2;
    }
    return 0;
}

我尝试将len初始化为1,但仍然失败。奇怪的是它在第一次通话时没有失败,但在第二次通话时失败了。我读过其他类似的问题,但我是初学者,我不明白。 提前谢谢!

1 个答案:

答案 0 :(得分:6)

在你的程序中,你正在访问一个超出范围的数组。这会导致不确定的行为。

最初,len = 0时,while循环:

ar[len] = 2;  //ar[0] = 2;
len++;        //len = 1
ar = (int *) realloc(ar, len * sizeof(int));
//ar is of size 1

然后在下一次迭代中,len = 1

ar[1] = 2; //you cannot access ar[1] as size of `ar` is only 1.

每次迭代都会继续。为了避免这种情况:

//initialize len to 1
int len = 1;

并在ar[len-1]循环中使用ar[len]代替while

看看这个:How dangerous is it to access an array out of bounds?