You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用realloc()出现invalid next size错误的原因排查

解决动态结构体数组realloc(): invalid next size错误

你的代码核心错误是没有保存realloc的返回值到传入的指针变量,这直接导致了内存管理混乱。

问题分析

realloc的行为是:如果原内存块有足够空间扩容,就返回原指针;如果空间不足,会分配一块新内存、复制原数据到新内存,然后释放旧内存,返回新指针。
你当前的代码里,调用realloc((*products), (*size) * sizeof(Product))后,没有把返回的新指针赋值给*products,导致*products仍然指向已经被realloc释放的旧内存。后续操作这块失效内存时,会破坏堆的内存管理结构,触发realloc(): invalid next size错误。

另外,malloc(0)虽然符合C标准,但不同编译器实现的行为可能不一致,初始化为NULL更稳妥——因为realloc(NULL, size)等价于malloc(size),完全适配动态数组的初始状态。

修正后的代码

typedef struct Product_t {
    char name[100];
    int price;
    int id;
} Product;

void add_product(Product** products, Product product, int *size) {
    (*size) += 1;
    // 用临时指针接收realloc结果,避免realloc失败时丢失原指针
    Product* temp = realloc(*products, (*size) * sizeof(Product));
    if(temp == NULL) {
        // 扩容失败,回退size,保持状态一致
        (*size) -= 1;
        exit(1);
    }
    *products = temp; // 更新指针到新内存块
    (*products)[*size - 1] = product;
}

int main() {
    Product* products = NULL; // 初始化为NULL代替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);
    
    // 使用完毕释放内存,避免泄漏
    free(products);
    return 0;
}

关键注意事项

  • 必须保存realloc的返回值,不能直接忽略。如果直接写*products = realloc(...),一旦realloc失败返回NULL,会丢失原指针导致内存泄漏,用临时指针中转是更安全的做法。
  • 扩容失败时要回退size,因为实际并没有成功添加元素,需要保持数据和状态的一致性。
  • 动态内存使用完毕后必须调用free释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者gluhtuten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:37:02