我正在try 将元素添加到函数中的动态 struct 数组中.一切似乎都是正确的,当我添加第一个元素时,它实际上成功了,但当我try 添加另一个元素时,我得到:

realloc(): invalid next size

我try 以多种方式对其进行调试,判断是否所有的值都是正确的--当前大小、分配的内存等等,一切都是正常的.我甚至"手动"地做了(没有一个函数),它的工作就像它应该工作的那样,但当我用这个函数做它时,它失败了.我是不是在代码中犯了一个我看不到的错误,或者我错过了一些关于动态内存分配的东西?

以下是代码:

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;
}

附注:例如,我知道使用链表会更好,但我需要使用动态array.

推荐答案

传递到realloc的指针所指向的地址不能保证在realloc的每个手册页上保持不变.因此,除非返回值为NULL,否则需要始终将返回值realloc(...)赋给(*products).

C++相关问答推荐

C中出现分段错误后关闭文件

VS代码C/C++扩展intellisense无法检测环境特定函数'

将 typewriter LF打印到Windows终端,而不是隐含的CR+LF

从纯C中访问通用项对话框

如何知道我是否从非阻塞套接字读取所有内容

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

在 struct 中强制转换空指针

Make Node函数.S有什么问题吗?

使用错误的命令执行程序

如何使用_newindex数组我总是得到错误的参数

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

静态初始化顺序失败是否适用于C语言?

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

传递给函数的 struct 中的数组

我的代码可以与一个编译器一起使用,但不能与其他编译器一起使用

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

Struct 内的数组赋值

使用 GCC 将一个函数中初始化的 struct 体实例通过指针传递到 C 中的另一个函数会产生不同的结果

C 中类型说明符的顺序重要吗?

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组