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

Gus*_*Gus -1 c memory-management realloc

我试图实现一个dinamically增加数组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;
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

如您所见,foo [3]的值在我第二次调用时递增1 add.奇怪的是,如果传递给的第一个值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
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*CAT 5

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

foo = (int*) realloc(foo, sizeof(int) * (quantity + 1));
Run Code Online (Sandbox Code Playgroud)