当我尝试释放字符串时,无效的下一个大小(快)

时间:2017-03-20 20:28:28

标签: c pointers memory-management crash

当我无法弄清楚我的代码的问题。该程序的目标是从文本文件中读取单词并将其添加到链接列表中。当我运行时:

static char *make_string(char buffer[], int length) {
      char *str = (char *)(malloc(length+1));
      memcpy(str, buffer, length);
      str[length + 1] = '\0';
      return str;
    }

char *words_next_word() {
  char buf[MAXBUF] = {0};

  int character = getchar();
  int index = 0;
  static int count = 0;
  printf("it is the %d word \n", count);
  count++;

  while(isalnum(character) == 0){
    character = getchar();
  }

  while(character != EOF && isalnum(character) != 0){
    buf[index] = character;
    index++;
    character = getchar();
  }

  return make_string(buf, index);
}

从文本文件中获取单词后,我将其添加到链接列表中。添加单词后,我释放了字符串。前138个单词被读取并释放没有问题。出于某种原因,程序在尝试阅读第138个单词时崩溃了,但我不知道为什么。

1 个答案:

答案 0 :(得分:0)

  

前138个单词被读取并释放没有问题。

不是真的。即使在第一次make_string()电话中也存在问题。

代码正在尝试复制字符串,但却有一个错误。

static char *make_string(char buffer[], int length) {
      char *str = (char *)(malloc(length+1));  // size good
      memcpy(str, buffer, length);             // copy OK
      str[length + 1] = '\0';     // null character assigned in wrong place, 1 too far out
      return str;
    }

在错误的位置分配数据(指定越界@EOF)并且没有使用空字符定义str[length]的值(以及稍后使用它)会导致未定义的行为

Herestrdup()函数,但我建议您在审核之前尝试对make_string()进行代码修复。

以下代码不限制写入buf[]

while(character != EOF && isalnum(character) != 0){
    if (index + 1 >= MAXBUF) {
      puts("Too long");
      return NULL; // or some other error handling
    }
    buf[index] = character;