使用realloc正确方法[重复]

a8jjtwal  于 2023-05-28  发布在  其他
关注(0)|答案(2)|浏览(113)

此问题已在此处有答案

Proper usage of realloc()(6个答案)
3天前关闭。
我有下面这行代码,哪个代码段正确使用了realloc?
我怀疑 *delete_choices行中的realloc调用使用错误,这是正确的吗?

*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);

真的很困惑

jm81lzqq

jm81lzqq1#

*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 = realloc (*delete_choices, files_max);

此外,上面的代码片段可能会引发未定义的行为,因为如果realloc()失败并返回NULL指针,您将无法访问通过malloc()分配的原始内存(假设malloc()成功),并泄漏内存。

解决方案:

使用临时指针存储realloc()的返回值:

/* Yes, the usage is correct. */
char *const tmp = realloc(*delete_choices, files_max);
if (!tmp) {
    perror("realloc()");
    complain();
}
      
*delete_choices = tmp;

注意:不要强制转换malloc()和family的返回值。这些函数返回一个泛型void *,它被隐式转换为任何其他指针类型。强制转换是多余的,只会使代码变得混乱。

ttisahbt

ttisahbt2#

*delete_choices = (char*)realloc( *delete_choices, files_max );是正确的用法。
传递的类型必须等于返回的类型。
在你的例子中,delete_choices看起来是char**类型,因此*delete_choiceschar*类型,所以这两个类型不相等。
一般情况下:t = (T)realloc( t, n );

相关问题