#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()
помощью ingetline()
.2. В дополнение к предыдущему комментарию это также означает
getline
, что передается неверноеlen
значение, поскольку увеличенный указатель означает, что размер буфера фактически уменьшился для следующегоgetline
вызова. Такgetline
что, скорее всего, переполнение буфера.3. Ах, так мне следует сохранить копию оригинала и сменить другую?
4. Спасибо вам обоим. это работает сейчас, после того как я скопирую оригинал и изменю новый. Имеет смысл. 🙂
5. Голосование за закрытие как «невоспроизводимое», поскольку проблема была исправлена с помощью комментариев, и это вопрос типа «отладка моей программы», который вряд ли будет полезен будущим читателям.