我的代码有问题.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但它仍然失败.奇怪的是它在第一次通话时没有失败,但在第二次通话时失败了.我读过其他类似的问题,但我是初学者,我不明白.提前致谢!
在您的程序中,您正在访问一个超出范围的数组.这会导致不确定的行为.
最初,当len = 0
在while
循环中:
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
循环中使用.
看看这个:访问数组越界有多危险?