realloc 错误 - 递增数组的最后一个元素

realloc bug - incrementing last element of array

我正在尝试使用 realloc 实现一个动态递增的数组。我用 malloc 创建数组,然后调用我的 add 函数,它将数组大小增加 1。代码如下:

#include <stdio.h>
#include <stdlib.h>

int *foo;
int quantity;

void add(int number) {
    foo = (int*) realloc(foo, sizeof(foo) + sizeof(int));
    foo[quantity] = number;
    quantity++;
}

void debugFoo() {
    for (int i = 0; i < quantity; i++) {
        printf("foo[%i] = %i\n", i, foo[i]);
    }
    printf("\n");
}

int main() {
    quantity = 3;
    foo = (int*) malloc(quantity * sizeof(int));

    foo[0] = 1;
    foo[1] = 2;
    foo[2] = 3;

    debugFoo();

    add(20);
    debugFoo();
    add(2);
    debugFoo();

    return 0;
}

但是当我 运行 它时,我得到以下输出:

foo[0] = 1
foo[1] = 2
foo[2] = 3

foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 20

foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 21
foo[4] = 2

如您所见,我第二次调用 add 时,foo[3] 的值增加了 1。奇怪的是,只有当传递给 add 的第一个值是偶数时,它才会递增。将第 30 行更改为 add(21),我得到以下输出:

[...]
foo[2] = 3
foo[3] = 21

foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 21
foo[4] = 2

这是一个错误还是我使用 realloc 错误?

sizeof(foo) 总是 return 给你相同的值,可能是 4。因为 sizeof 运算符 return 给你 int *[=20= 的大小]

您已经 "correctly" 声明了一个全局范围变量 (quantity) 来存储您数组的当前大小,将该变量用于 realloc 您的结构,就像您对 malloc.

void add(int number) {
    quantity++;
    foo = realloc(foo, (quantity * sizeof(int)) );
    if (foo != NULL)
    {
       foo[quantity-1] = number;
    }
    else
    {
       fprintf(stderr, "Failed to add number.\n");
    }
}

请注意,始终检查函数 return 值非常重要。 如我在 returned 值 realloc 的示例中所示,您必须在 main 函数中对 malloc 执行相同的操作。

int main() {
    quantity = 3;
    foo = malloc(quantity * sizeof(int));
    if (foo != NULL)
    {
       foo[0] = 1;
       foo[1] = 2;
       foo[2] = 3;

       debugFoo();

       add(20);
       debugFoo();
       add(2);
       debugFoo();

       return 0;
    }
    else
    {
       fprintf(stderr, "Failed to allocate array.\n");
       return 1;
    }
}

sizeof(foo)不是分配缓冲区的大小而是foo的大小,即int*。使用保存的元素数来计算新的缓冲区大小。

foo = (int*) realloc(foo, sizeof(int) * (quantity + 1));