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

realloc函数正确用法咨询:delete_choices的调用是否有误?

关于realloc指针参数的正确性问题

我编写了一段代码,其中*delete_choices通过malloc完成初始化。当files_size大于等于files_max时,会对files和*delete_choices执行realloc扩容操作。我怀疑原代码中*delete_choices的realloc调用(即*delete_choices = (char*)realloc(delete_choices, files_max);)存在错误,想确认另一种写法*delete_choices = (char*)realloc(*delete_choices, files_max);是否正确,对此感到困惑。

原代码片段

*delete_choices = (char*)malloc(files_max);

if (files_size >= files_max)
{
    files_max *= 2;
    files = (struct dirent*)realloc(files, sizeof(struct dirent) * files_max);
    *delete_choices = (char*)realloc(delete_choices, files_max);
}

待验证的写法

*delete_choices = (char*)realloc(*delete_choices, files_max);

解答

你的待验证写法才是正确的,原写法存在明显错误:

  • 本质上delete_choices是二级指针(指向char*的指针),而*delete_choices才是你通过malloc分配到的堆内存地址。realloc要求第一个参数必须是之前通过malloc/calloc/realloc返回的堆内存指针,或者NULL。
  • 原代码中realloc(delete_choices, files_max)是把二级指针自身的变量地址传给了realloc,这完全不符合realloc的参数要求,会触发未定义行为(比如程序崩溃、内存损坏)。
  • 待验证的写法中,realloc(*delete_choices, files_max)传入的是真正的堆内存指针,这才是正确的用法。

另外补充两个实用建议:

  1. 不要强制转换malloc/realloc的返回值:在C语言中,void*可以隐式转换为任意指针类型,强制转换不仅多余,还可能隐藏指针类型不匹配的编译警告。
  2. 用临时变量接收realloc返回值:如果realloc内存分配失败会返回NULL,直接赋值会覆盖原来的有效指针,导致内存泄漏。正确的写法示例:
char* temp_buf = realloc(*delete_choices, files_max);
if (temp_buf == NULL) {
    // 处理分配失败的逻辑,比如打印错误、终止程序
    perror("realloc failed");
    exit(EXIT_FAILURE);
}
*delete_choices = temp_buf;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 18:22:49