getline & printf обнаружил "разбивание стека" - и я действительно не могу понять, почему - PullRequest
0 голосов
/ 28 января 2012

когда дело доходит до 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 (табуляции), записываемой в терминале.Кстати, я получаю сообщение об ошибке: Обнаружено разрушение стека *: ./afile прекращено Ошибка сегментации

Ответы [ 3 ]

2 голосов
/ 28 января 2012

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

char *line = NULL;

, и все должно быть в порядке.

2 голосов
/ 28 января 2012

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

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

    ...
}
1 голос
/ 28 января 2012

Ваши перенаправления указателя противоречивы. Строка переменной объявлена:

char **line;

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

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

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

char *line;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...