Ошибка доступа к памяти: двойное освобождение или повреждение (нет) - PullRequest
0 голосов
/ 19 сентября 2018

Столкнувшись с довольно запутанной проблемой.Я поместил операторы печати перед строкой free ('line'), и кажется, что массив символов, объявленный как char * line, печатает как надо.

Я создал пользовательскую функцию strdupe дляцель эффективности.nthread_lines представляет массив строк, длина каждой строки которых является переменной.

Ниже приведен соответствующий код:

#define NUM_THREADS     5

char *strdupe(const char *src) {
    size_t len = strlen(src) + 1;
    char *s = malloc(len);
    if (s == NULL)
        return NULL;
    return (char *)memcpy(s, src, len);
}

int main(int argc, char *argv[]) {
  FILE *stream;
  // holds NUM_THREADS amount of lines read in from file
  char** nthread_lines;

  char *line = NULL;
  size_t len = 0;
  ssize_t nread;

  size_t NUM_THREADS_ctr = 0;
  nthread_lines = malloc(NUM_THREADS * sizeof(char *)); 

   while ((nread = getline(&line, &len, stream)) != -1) {

       nthread_lines[NUM_THREADS_ctr] = strdupe(line);

       printf("Length of buffer %d\n", strlen(nthread_lines[NUM_THREADS_ctr]));
       printf("Size of buffer CHECK %d\n", sizeof(nthread_lines[NUM_THREADS_ctr]));
       printf("Check nthread_lines:%s\n", nthread_lines[NUM_THREADS_ctr]);

       printf("\n");

       printf("Length of buffer %d\n", strlen(line));
       printf("Size of buffer CHECK %d\n", sizeof(line));               
       printf("Check line:%s\n", line);



       NUM_THREADS_ctr++;

   }

   printf("Size of buffer, len: %d\n", len);
   printf("Length of buffer %d\n", strlen(line));
   printf("Size of buffer CHECK %d\n", sizeof(line));
   printf("CHECK:%s\n", line);


   free(line); // cause the double free error
   fclose(stream);

   return 0;
}

Ниже приведен файл, с которым я тестировал:

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
Line 11Line 11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...