Путаница в отношении примера недопустимого использования setbuf на странице руководства

От man setbuf в Ubuntu:

Вы должны убедиться, что пространство, на которое указывает buf, все еще существует в потоке времени, закрыто, что также происходит при завершении программы. Например, следующее недопустимо:

Неверный пример кода из справочной страницы:

#include <stdio.h>

int main(void)
{
    char buf[BUFSIZ];
    setbuf(stdin, buf);
    printf("Hello, world!\n");
    return 0;
}

Почему он недействителен? Локальная переменная buf уничтожается после возврата программы через return 0;.


person Rick    schedule 04.03.2019    source источник


Ответы (1)


После выполнения return buf больше не существует, но выполнение программы продолжается с вызовом обработчиков выхода и закрытием потоков. Итак, когда поток закрыт, буфер не существует.

person Eric Postpischil    schedule 04.03.2019
comment
Ok. Так что мне просто нужно malloc немного динамической памяти и дать ей просочиться. :) - person Rick; 04.03.2019
comment
Или вы можете воздержаться от возвращения и вместо этого позвонить exit. - person R.. GitHub STOP HELPING ICE; 04.03.2019
comment
Или просто сделать буфер static. - person rici; 04.03.2019
comment
Вы также можете опустить вызов setbuf() и просто позволить стандартной библиотеке ввода-вывода делать свое дело. Есть еще много причин позвонить setvbuf(); есть несколько причин позвонить setbuf(). - person Jonathan Leffler; 04.03.2019
comment
Вы также можете вызвать fclose(stdout); в main() - это тоже будет работать (хотя любые функции, зарегистрированные в atexit(), которые пишут в stdout, не смогут этого сделать). - person Jonathan Leffler; 04.03.2019
comment
Не подведи. Это вызовет UB. - person R.. GitHub STOP HELPING ICE; 04.03.2019