Странная проблема fgets () - PullRequest
       3

Странная проблема fgets ()

0 голосов
/ 19 сентября 2010

Я пытаюсь запустить этот код в Windows 7 (64-битной, если это имеет значение) после компиляции с помощью GCC.Если я объявляю bufsize как int, программа зависает, и Windows сообщает мне, что она перестала работать.Если я использую #define bufsize 123, он работает нормально, и работает нормально, если я заменю bufsize на число самостоятельно.Что мне здесь не хватает?

int main(int argc, char* argv[]) {

    char* filename = argv[1];

    FILE* problem = fopen(filename, "r");
    if (!problem) {
        printf("File doesn't exist\n");
        exit(1);
    }

    char* line;
    while (fgets(line, bufsize, problem) != NULL) {        
        printf(line);
    }


    return 0;
}

Ответы [ 4 ]

2 голосов
/ 19 сентября 2010

line - это указатель, но он никуда не указывает (или, что еще лучше, он не был инициализирован и его значение неопределенное и непригодное для использования).Указатель, который нигде не указывает, не очень полезен.

Выделите немного памяти и заставьте line указать на эту память.Не забудьте освободить память, когда она вам больше не нужна. Значение

line = malloc(200);
if (line == NULL) { /* something went wrong, the pointer is pointing nowhere */ }
/* ... use allocated memory ... */
free(line);

Oh ... и bufsize должно соответствовать количеству выделенных вами байтов.

Также #include <stdlib.h>, поскольку *У 1012 * и free() есть свой прототип.

1 голос
/ 19 сентября 2010

bufsize - это размер буфера, который вы должны выделить и передать в fgets.Вы вообще не выделили никакого буфера, а затем вы врете fgets, сообщая, что вы передаете буфер определенного размера.Неважно, какой размер вы используете или как вы его передаете в fgets - если вы не выделяете буфер, ваш код будет зависать или работать непредсказуемо.

Пока размер буфера равенне очень большой, вы можете объявить его как локальный массив, вместо того, чтобы выделять его динамически

char line[bufsize];
while (fgets(line, bufsize, problem) != NULL) {        
    printf(line);
}
1 голос
/ 19 сентября 2010

Вы не выделили место для буфера, на который указывает line.

Вам необходимо сделать:

line = malloc(bufsize);

и освободить его, используя:

free(line);
0 голосов
/ 19 сентября 2010
char* line = malloc(bufsize);
...