使用 realloc 增加数组的大小

Using realloc to increase the size of an array

我正在尝试将一堆字符扫描到一个数组中。我已经使用 malloc 来设置数组的原始大小,但是如果用户输入的字符多于初始大小所允许的,我想使用 realloc 来增加大小。我不太确定将 realloc 放在哪里,或者它是否应该在条件语句中。

char *strscan(void) {
  int size = sizeof(char) * 10;
  char *a = malloc(size);

  // Below I try to read character input from the user and store it in the array.

 while (a != EOF) {

    scanf("%c", a);
    if (trace) printf("%c", *a);
    ++a;
    a = realloc(a, 2 * size);
 }

    return a;

}

到目前为止,我仍然会在输入 15 个字符时出现堆缓冲区溢出。

++a;
a = realloc(a, 2 * size);

这就是问题所在。 realloc 的第一个参数必须是 malloc 系列函数返回的指针,或者是空指针。 a曾经是一个,但是到了++a;,就不再是了。

你需要两个指点。一是缓冲区的位置。另一个是当前角色的位置。当它们之间的差异足够大时,重新分配缓冲区并重置指针。

删除 ++a 。就是这里的罪魁祸首。

realloc() 接受 NULL 指针或 malloc 返回的指针。

阅读手册页。

希望你明白。快乐编码..

我看到这里有两个问题。

首先是递增 a,然后将递增的值传递给 realloc。由于传递给 realloc 的指针不是从 malloccallocrealloc 返回的值,或者是 NULL,这可能会导致错误。

第二个问题是您在第一次调用 realloc 后没有增加内存缓冲区的大小,因为您总是传递它 2 * sizesize永远不会改变。所以你最终 运行 超过了缓冲区的末尾。

您需要一个单独的指针来跟踪下一个字符的位置,并且您需要跟踪当前缓冲区的大小,并且 realloc 仅当现有缓冲区几乎已满时。

char *strscan(void) {
  size_t size = sizeof(char) * 10;
  char *a = malloc(size);
  char *current;  // The current character
  ptrdiff_t diff;

  current = a;
  do {
    scanf("%c", current);
    if (trace) printf("%c", *current);
    if (current - a >= size - 1) {
      size *= 2;
      diff = current - a;
      a = realloc(a, size);
      current = a + diff;   // Since "a" could change, we need to modify "current" as well
    }
  } while (*current++ != '\n');
  *current = '\x0';

  return a;
}