сбой стека обнаружен getline и printf - и я действительно не могу понять, почему

когда дело доходит до C, я не нуб - я больше похож на полного и полного тупого невежественного нуба! я пытаюсь написать программу для анализа простых текстовых файлов, и я хотел бы сделать ее как можно более общей (почему я использую getline). ну вот мой код:

//afile.c 
#include <stdio.h>
#include <stdlib.h>

main( )
{FILE *fp1;
char *filename;
char **line;
size_t *sz;
int s;

filename = "n";
if ((fp1 = fopen(filename,"r")) == NULL ){printf("error...");return 1;}
        do {
    s = getline(&line,sz,fp1);
if (s != -1)
  printf(" %s  \n",line);//<-- %s seems to be wrong! %*s removes the gcc warning  
} while (s != EOF); 
fclose(fp1);}

Я почти уверен, что это какая-то проблема с распределением указателей, но я действительно не могу понять, где она. я обнаружил, что замена %s на %s приводит к исчезновению предупреждения компилятора, но в результате в терминале записывается бесконечное количество \t(tabs). Между прочим, сообщение об ошибке, которое я получаю: обнаружен сбой стека *: ./afile завершен Ошибка сегментации


person Ro Pedersen    schedule 28.01.2012    source источник
comment
Попробуйте инициализировать line = NULL   -  person wildplasser    schedule 28.01.2012
comment
char **line мне кажется неправильным   -  person Jim Rhodes    schedule 28.01.2012


Ответы (3)


getline ожидает аргумент типа char**, а вы предоставили &line, что равно char***. Кроме того, getline действует на текущее значение значения, на которое указывают его первые аргументы (то есть значение line), и вы не инициализировали его. Измените свою программу на:

char *line = NULL;

и это должно быть хорошо.

person thiton    schedule 28.01.2012

Вам не удалось инициализировать линейную переменную, и она содержит случайное значение. Readline, вероятно, пытается перераспределить его. ОБНОВЛЕНИЕ: определение строки также неверно, требуется только одна звездочка, как указывали другие.

int main(void )
{
    FILE *fp1;
    char *filename;
    char *line = NULL; /* <- here */
    size_t *sz;
    int s;

    ...
}
person wildplasser    schedule 28.01.2012

Перенаправления вашего указателя несовместимы. Объявляется переменная строка:

char **line;

Что является указателем на указатель на символ или указатель на строку. getline() ожидает указатель на строку, но вы передаете &line - указатель на указатель на строку.

Наконец, ваш указанный формат printf() - %s, если он хочет отформатировать строку, но вы даете ему указатель на строку.

Короче говоря: уберите звездочку, чтобы создать

char *line;
person Community    schedule 28.01.2012