fmemopen не пишет в c-string

Я не могу заставить fmemopen последовательно печатать cstring. Делать что-то вроде этого:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char buf[256];
    FILE *out;

    out = fmemopen(buf, strlen(buf), "w");
    fprintf(out, "Hello world");
    fclose(out);
    puts(buf);

    return 0;
}

Выводит только "H".

Я пробовал использовать open_memstream

#include <stdio.h>
#include <string.h>

int main(void)
{
    char *buf;
    int buf_size;
    FILE *out;

    out = open_memstream(&buf, &buf_size);
    fprintf(out, "Hello world");
    fflush(out);
    puts(buf);
    free(buf);
    fclose(out);

    return 0;

}

Это, кажется, работает, но в других контекстах это, кажется, segfault.

Как я могу заставить fmemopen работать последовательно и / или как я теряю значение указателя, возвращенного из open_memstream?

РЕДАКТИРОВАТЬ: я вижу, как я получаю segfaults с open_memstream после более пристального взгляда на мой код. Я все еще хочу знать, почему fmemopen не работает, хотя.

1 ответ

Решение

Согласно вашему первому коду:

призвание strlen(buf) вызывает неопределенное поведение, так как содержимое buf не определено использование sizeof(buf) вместо.

POSIX группа не хочет, чтобы пользователи использовали двоичный режим "b" для fmemopen, Glibc убрал этот флаг. Таким образом, вы должны зарезервировать 1 байт в конце буфера для нулевого символа. В противном случае запись может просто молча завершиться неудачей, и вы получите этот нулевой символ в текущей позиции.

Другие вопросы по тегам