【问题标题】:Array of strings memory reallocation in CC中的字符串内存重新分配数组
【发布时间】:2022-01-01 08:50:48
【问题描述】:

我有一个项目要做,我需要为数组重新分配内存。我尝试了很多次,但我发现只有一个版本有效。

void resize(int* size, char*** arr)
{
    *size *= 2;
    *arr = realloc(*arr, sizeof(char*) * *size);
    nulltest(*arr);    // This checks if the allocation was successful
}
resize(&size, &arr);

这个函数把数组的容量加倍了,但是我觉得做的太复杂了,所以想问问各位大大,能不能简化一下。我也乐于接受新的解决方案。

【问题讨论】:

  • 简化是什么意思?这就是实现中的三行代码,使用的一行代码,你需要它简单到什么程度?
  • 这个函数只做一件事——引入错误。不好,不需要
  • 是的,我同意,我会直接调用realloc,但可以说这使得它变得不那么简单,因为您确实需要在任何地方而不是在函数内部进行新的大小计算和错误检查。 (我也给出了怀疑的好处,并假设nulltest 在失败时使程序崩溃,这就是不需要返回错误状态的原因。)
  • 但是,忽略这个问题,我认为将其复杂化而不是简化是有益的,例如,测试错误并允许调用者确定大小是如何增加的(例如何时* 2 如果最终大小已知,则不够或过多)。但是,正如已经指出的那样,您基本上只有realloc

标签: arrays c string pointers realloc


【解决方案1】:
  1. int 不是适合大小的类型。使用正确的size_t
  2. 在没有特殊需要的情况下尽量避免副作用(即修改通过引用传递的对象)。
  3. 您的代码可能会泄漏内存。如果realloc 失败,您将失去对先前分配的内存的引用。 size 引用的整数也无需更改。

我会这样实现它:

char **resize(char **arr, size_t newsize)
{
    return realloc(arr, size * sizeof(*arr));
}

调用函数应该检查错误。

但是定义这个函数有什么意义呢?这个只返回realloc的返回值。

【讨论】:

  • 非常感谢。我对 C 和动态内存很陌生,这就是为什么我写了工作,但显然是糟糕的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2018-09-29
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2012-11-10
相关资源
最近更新 更多