我在玩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