fmemopen没有写入c-string

时间:2014-03-19 18:59:49

标签: c io cstring

我不能让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;

}

这似乎有效,但在其他情况下,似乎是段错误。

如何让fmemopen始终如一地工作和/或我如何忘记从open_memstream返回的指针的值?

编辑:在仔细查看我的代码后,我看到我是如何使用open_memstream获取段错误的。我仍然想知道为什么fmemopen不起作用。

2 个答案:

答案 0 :(得分:1)

根据您的第一段代码:

调用strlen(buf)会调用未定义的行为,因为buf的内容未定义。请改用sizeof(buf)

答案 1 :(得分:0)

POSIX组不希望用户为fmemopen使用二进制模式“ b”。 Glibc删除了此标志。因此,您必须在缓冲区末尾保留1个字节以保留空字符。否则,写操作只会静默失败,您将在当前位置收到此空字符。