2017-05-07 67 views
1

我在代码中有问题。 malloc工作和在while循环,realloc()第一次工作,当它被称为第二次它总是失败。 该代码是获取数字的主要因素的算法的一部分。为什么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,但仍然失败。奇怪的是它在第一次通话中不会失败,但在第二次通话时失败。我已经阅读过其他类似的问题,但我是初学者,我不了解。 在此先感谢!

+0

没有包括''和演员来的'realloc'使所有的差异造成的。 – pmg

+0

@pmg我已经包括,我不明白realloc有什么问题 –

+0

没有''包括在内,编译器假定'realloc'返回一个int,然后在cast中将int转换为一个指针。首先:'malloc'返回一个指针并将该指针解释为一个int值可能会改变该值。其次:将(无效)int转换为指针是无效的转换;该转换使得编译器在没有警告的情况下接受它。 – pmg

回答

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; 

,并在while循环使用ar[len-1],而不是ar[len]

看一看这样的:How dangerous is it to access an array out of bounds?

+1

感谢您纠正我的英语! –