使用realloc增加数组的大小

时间:2015-07-12 02:06:15

标签: c arrays malloc realloc

我正在尝试将一堆字符扫描成一个数组。我已经使用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个字符。

4 个答案:

答案 0 :(得分:4)

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

这就是问题所在。 realloc的第一个参数必须是由malloc族函数或空指针返回的指针。 a曾经是{1},但++a;已经不再存在了。

答案 1 :(得分:3)

我在这里看到两个问题。

首先是你递增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;
}

答案 2 :(得分:2)

删除++ a。这是罪魁祸首。

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

阅读手册页。

希望你理解。快乐的编码..

答案 3 :(得分:1)

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