В C я пытаюсь реализовать функцию, которая использует getline()
для чтения всех строк из файла.Он реализован аналогично getline()
, в частности тот факт, что он использует realloc()
для изменения размера char**
, если недостаточно памяти, выделенной для хранения следующего указателя на строку.К сожалению, я получаю ошибки seg во время процесса дублирования строки.
После небольшого возни, я обнаружил, что segfault происходит во время второй итерации при попытке сохранить вторую строку в массиве указателей на символы.
ssize_t fgetlines(char*** linesptr, size_t* n, FILE* fp)
{
char* line = NULL;
size_t sz_line = 0;
size_t cur_len = 0;
size_t needed;
if (linesptr == NULL || n == NULL) {
errno = EINVAL;
return -1;
}
if (*linesptr == NULL) {
if (*n == 0)
*n = sizeof(**linesptr) * 30; /* assume 30 lines */
*linesptr = malloc(*n);
if (*linesptr == NULL) {
*n = 0;
return -1;
}
}
while (getline(&line, &sz_line, fp) > 0) {
needed = (cur_len + 1) * sizeof(**linesptr);
while (needed > *n) {
char** new_linesptr;
*n *= 2;
new_linesptr = realloc(*linesptr, *n);
if (new_linesptr == NULL) {
*n /= 2;
free(line);
return -1;
}
*linesptr = new_linesptr;
}
*linesptr[cur_len] = strdup(line);
printf("%s", *linesptr[cur_len]);
if (*linesptr[cur_len] == NULL) {
free(line);
free(*linesptr);
return -1;
}
++cur_len;
}
free(line);
return cur_len;
}
И я вызываю функцию так:
char **settings = NULL;
size_t sz_settings = sizeof(*settings) * 6;
int count = fgetlines(&settings, &sz_settings, f_cfg);
Из-за невозможности успешного завершения функции я не получаю никакого вывода.Но после печати строки после strdup()
мне удалось получить одну строку f_cfg
, "Hello World"
до ошибки сегмента.