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 байт в конце буфера для нулевого символа. В противном случае запись может просто молча завершиться неудачей, и вы получите этот нулевой символ в текущей позиции.