为什么realloc每次都失败?

Tim*_*tei 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Che*_*bim 6

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

最初,当len = 0while循环中:

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

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

ar[1] = 2; //you cannot access ar[1] as size of `ar` is only 1.
Run Code Online (Sandbox Code Playgroud)

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

//initialize len to 1
int len = 1;
Run Code Online (Sandbox Code Playgroud)

ar[len-1]不是ar[len]while循环中使用.

看看这个:访问数组越界有多危险?