【问题标题】:Why does realloc fails every time?为什么realloc每次都失败?
【发布时间】:2017-05-07 17:53:52
【问题描述】:

我的代码有问题。 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,但它仍然失败。奇怪的是,它在第​​一次调用时没有失败,但在第二次调用时却失败了。我读过其他类似的问题,但我是初学者,我不明白。 提前致谢!

【问题讨论】:

  • 未能包含<stdlib.h> 以及对realloc 的结果的强制转换使一切变得不同。
  • @pmg 我已经包含了 但我不明白 realloc 有什么问题
  • 如果不包含<stdlib.h>,编译器假定realloc 返回一个int,然后通过强制转换将该int 转换为指针。首先:malloc 返回一个指针并将该指针解释为 int 可能会更改值。第二:将(无效的)int 转换为指针是无效的转换;强制转换使编译器在没有警告的情况下接受它。

标签: c arrays dynamic


【解决方案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

然后在下一次迭代中,当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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多