I am trying to add elements to a dynamic array of structures in a function. Everything seems to be correct and when I add the first element it actually succeeds but when I try to add another I get:
realloc(): invalid next size
I tried to debug it in many ways, checking if all of the values are correct - the current size, the allocated memory and so on and everything is as it should be. I even did it "manually" (without a function) and it worked as it is supposed to work but when I do it with the function it fails. Is there a mistake I have made in my code which I do not see or am I missing something about allocating dynamic memory?
Here is the code:
typedef struct Product_t {
    char name[100];
    int price;
    int id;
} Product;
void add_product(Product** products, Product product, int *size) {
    (*size) += 1;
    
    if(realloc((*products), (*size) * sizeof(Product)) == NULL)
        exit(1);
        
    (*products)[*size - 1] = product;
}
int main() {
    Product* products = (Product*) malloc(0);
    int products_size = 0;
    
    Product p1 = {"product1", 45, 1};
    Product p2 = {"product2", 212, 2};
    Product p3 = {"product3", 123, 3};
    
    add_product(&products, p1, &products_size);
    add_product(&products, p2, &products_size);
    add_product(&products, p3, &products_size);
    
    return 0;
}
P.S. I know it would be better to do this with a linked list for example but I am required to do it with a dynamic array.
 
     
    