Почему я получаю поврежденный размер по сравнению с размером prev_size при анализе csv-файла на C?

#c #memory-leaks

Вопрос:

Я пытаюсь перебрать csv-файл ( | в качестве разделителя) строка за строкой, захватить определенное поле в каждой строке и распечатать его. Но я получаю corrupted size vs. prev_size во время выполнения кода.

 #include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;assert.hgt; #include lt;stringgt;  int main() {  FILE* fp = fopen("customer.tbl", "r");  if (fp == NULL)  exit(EXIT_FAILURE);    char* line = NULL;  size_t len = 0;  while ((getline(amp;line, amp;len, fp)) != -1) {  char c_mktsegment[100] = {};  int mkt_idx = 0;  int count=0;   while(*line != ''){  if(*line == '|'){  count  ;  }    else if (count==6){  c_mktsegment[mkt_idx  ] = *line;  }   else if (countgt;6){  c_mktsegment[mkt_idx] = '';  break;  }  //printf("%c", *line);  line  ;  }  printf("%s ", c_mktsegment);   }   fclose(fp);  //if (line)  // free(line); }  

Тестовый ввод:

 1|Customer#000000001|IVhzIApeRb ot,c,E|15|25-989-741-2988|711.56|BUILDING|to the even| 2|Customer#000000002|XSTf4,NCwDVaWNe6tEgvwfmRchLXak|13|23-768-687-3665|121.65|AUTOMOBILE|l accounts|   

Я ориентируюсь на ценности BUILDING , AUTOMOBILE

Выход:

 xVSJsLAGtn|4|14-128-190-5944|28Expected Expected Expected Expected Expected  Expected Expected Expected Expected Expecorrupted size vs. prev_size  

Кроме того, если я включу free(line) конец блока кода, я получу munmap ошибку. Может ли кто-нибудь объяснить, что происходит не так в этих двух случаях?

Комментарии:

1. Вы меняетесь line , поэтому вызываете free() с другим указателем, чем тот, который изначально был выделен с malloc() помощью in getline() .

2. В дополнение к предыдущему комментарию это также означает getline , что передается неверное len значение, поскольку увеличенный указатель означает, что размер буфера фактически уменьшился для следующего getline вызова. Так getline что, скорее всего, переполнение буфера.

3. Ах, так мне следует сохранить копию оригинала и сменить другую?

4. Спасибо вам обоим. это работает сейчас, после того как я скопирую оригинал и изменю новый. Имеет смысл. 🙂

5. Голосование за закрытие как «невоспроизводимое», поскольку проблема была исправлена с помощью комментариев, и это вопрос типа «отладка моей программы», который вряд ли будет полезен будущим читателям.