我在玩c11标准中提到的“新”stdio功能:open_memstream
和fmemopen
。为什么setbuf与open_memstream文件崩溃?
编译在Ubuntu 16.10用gcc或Rextester与铛(见下面的链接),用于缓冲模式
size_t sizeloc = 0; char *bufloc = NULL;
FILE *mf = open_memstream (&bufloc, &sizeloc);
setbuf(mf, NULL); // this crashes
调用函数setbuf与open_memstream抛出SIGSEGV创建的文件。 (我想设置无缓冲模式,而不是在每次写入后调用fflush
。顺便说一下,fflush的工作原理。)
为什么setbuf(mf,NULL)崩溃?我做错了什么?
对其他函数返回的文件,fmemopen,setbuf(mf, NULL)
的作品,似乎做了什么样的预期。
我不知道你从哪里得到这个,但是这两个函数肯定不是C11。他们是POSIX 2008,我认为在其他系统上不支持。所以他们与C99和C11都没什么关系。我删除这些标志并添加POSIX。 –
试图改变完全在内存中工作的函数的缓冲行为听起来很奇怪。你不认为你的实现提供者已经尽可能地优化了吗?改变与设备相对应的文件的缓冲是有意义的,因为这些缓慢(延迟或吞吐量),但是在这里没有。另外,无论如何,你只能在'fflush'后面访问得到的缓冲区。 –
谢谢Jens。实际上我预计这些内存映射流是无缓冲的,它们的后备内存立即包含最后一次写入的结果。但事实并非如此。需要冲洗。这就是为什么我试图设置无缓冲模式,并且似乎与其中一种模式一起工作的原因。 – ddbug