C - realloc错误:大小损坏vs prev_size

时间:2018-01-09 22:48:27

标签: c memory-management malloc realloc

有人可以解释一下这个错误吗? 我得到了这个错误,直到我一时兴起改变了这一行:

char *tmp = realloc(str, sizeof(char)*length);
// to                                           added 1
char *tmp = realloc(str, sizeof(char) * length + 1);

我认为将sizeof(char)乘以长度会重新分配size=sizeof(char)*length的新内存区域。我不明白为什么添加1可以解决这个问题。

    void edit_print(char *inputStr, size_t space_size) {
      size_t ch_position = 0;
      size_t space_column_count = 0;
      size_t num_spaces_left = 0;
      while ((inputStr[ch_position] != '\0')) {
        if ((inputStr[ch_position] == '\t') && (space_size !=0)) {
          num_spaces_left = (space_size-(space_column_count % space_size));
          if (ch_position == 0 || !(num_spaces_left)) {
            for (size_t i=1; i <= space_size; i++) {
              putchar(' ');
              space_column_count++;
            }
            ch_position++;
          } else {
            for (size_t i=1; i <= num_spaces_left; i++) {
              putchar(' ');
              space_column_count++;
            }
            ch_position++;
          }
        } else {
          putchar(inputStr[ch_position++]);
          space_column_count++;
        }
      }
      printf("\n");
    }

        int main(int argc, char *argv[]) {
          size_t space_size_arg = 3; 
          int inputch;
          size_t length = 0;
          size_t size = 10;
          char *str = realloc(NULL, sizeof(char) * size);
          printf("Enter stuff\n");

          while ((inputch = getchar()) != EOF) {
            if (inputch == '\n') {
              str[length++] = '\0';

              //changed line below
              char *tmp = realloc(str, sizeof(char) * length + 1);

              if (tmp == NULL) {
                exit(0);
              } else {
                str = tmp;
              }
              edit_print(str, space_size_arg);
              length = 0;
            } else {
              str[length++] = inputch;
              if (length == size) {
                char *tmp = realloc(str, sizeof(char) * (size += 20));
                if (tmp == NULL) {
                  exit(0);
                } else {
                  str = tmp;
                }
              }
            }
          }
          free(str);
          return 0;
        }
编辑:我原来得到的错误信息是这篇文章标题中的错误信息。在进行chux建议的更改后,错误是“realloc():下一个大小无效:* hexnumber **”

1 个答案:

答案 0 :(得分:2)

size时需要更新

inputch == '\n'

char *tmp = realloc(str, sizeof(char) * length + 1 /* or no +1 */);可以缩小分配。这使得后来的if (length == size)无效(真正的分配大小更小),因此str[length++] = inputch;丢失了内存访问保护。更新size以解决问题。

不需要

+1 - 它只是隐藏了问题,因为+ 1没有缩小分配量。

  char *tmp = realloc(str, sizeof(char) * length);
  if (tmp == NULL) {
    exit(0);
  } else {
    str = tmp;
  }
  size = length; // add

关于sizeof(char)*代码。按目标类型的大小进行缩放的想法很好,但char并不重要,因为总是 1。@Lee Daniel Crocker

如果代码想要反映目标类型可能会发生变化,请不要使用size(the_type),请使用sizeof(*the_pointer)。更容易编码,审查和维护。

// Don't even need to code the type `str` points to
tmp = realloc(str, sizeof *str * length);