【问题标题】:Realloc C string array heap corruptionRealloc C 字符串数组堆损坏
【发布时间】:2013-11-28 16:42:28
【问题描述】:

我正在尝试创建动态字符串数组作为读取文件的缓冲区。关键是数组必须以给定的大小声明,但如果文件包含的行数超过缓冲区大小,则必须调整大小。我创建的缓冲区如下所示:

#define N 32

char **array = (char**) malloc((N+1)*sizeof(char*));

当涉及到重新分配时,我已经尝试过这种方式:

array = (char**) realloc(array, (2*N+1)*sizeof(char*));

但不幸的是,它会导致堆损坏。我应该如何正确地做到这一点?

【问题讨论】:

  • 问题可能出在您使用 char** 而不是 char* 的事实;如果您为二维数组动态分配内存,那么您做错了。
  • 如何为字符串创建动态数组?
  • 如果你想要一个字符串数组,使用 char** 没有问题。但是,您的重新分配只会工作一次(因为大小是硬编码的),并且您使用 realloc() 的方式不能正确处理故障。也许你自己设置字符串的方式有问题?
  • 你做得对,你确定堆损坏在realloc行吗?
  • 从内存分配函数获取值时不需要强制转换。

标签: c arrays visual-studio-2010


【解决方案1】:

你需要两个维度,比如:

char **array = malloc((N+1) * (numEntries) * sizeof(char));

注意我使用的是sizeof(char),而不是sizeof(char *)

【讨论】:

  • 您可能忘记在 malloc 之前添加 (char **),但根据您的建议,我已经成功了。我不记得插入 numEntries 乘法。谢谢。
  • 小心。你应该只分配指针数组,你不能分配二维数组,因为编译器不知道如何分割“行”,在某些编译器中,只要你访问 array[0][x] 一切都好,但是当你尝试去 array[1][0] 你会遇到问题,其他编译器也将无法访问 array[0][0]。
  • 我怀疑char** 是否正确。这应该是 char (*array)[N+1] = ... 假设 N+1 是要存储在此数组中的字符串的大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
相关资源
最近更新 更多