Столкнувшись с довольно запутанной проблемой.Я поместил операторы печати перед строкой 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