私はc11標準で言及されている "新しい" stdio関数で遊んでいます:open_memstream
とfmemopen
。 gccでまたは打ち鳴らすとRextester上のUbuntu 16.10でコンパイルなぜopenbufがopen_memstreamファイルでクラッシュするのですか?
がSIGSEGVをスローopen_memstreamで作成したファイルにバッファなしモードの
size_t sizeloc = 0; char *bufloc = NULL;
FILE *mf = open_memstream (&bufloc, &sizeloc);
setbuf(mf, NULL); // this crashes
呼び出しはsetbuf(下記のリンクを参照してください)。 (私は毎回書き込み後にfflush
を呼び出すのではなく、バッファされていないモードを設定したいと思っています)。
なぜsetbuf(mf、NULL)がクラッシュするのですか?私は間違っているの?
fmemopen,setbuf(mf, NULL)
が動作し期待通りに動作しているようです。
これはどこから取得するのか分かりませんが、どちらの機能もC11ではありません。彼らはPOSIX 2008で、他のシステムではサポートされていないと私は思う。だから彼らはC99もC11もあまり関係ない。私はこれらのフラグを削除し、POSIXを追加します。 –
メモリ内で完全に機能する関数のバッファリング動作を変更しようとすると、奇妙な音がします。実装のプロバイダが既に最適化しているとは思わないでしょうか?デバイスに対応するファイルのバッファリングを変更することは、遅い(遅延またはスループット)可能性があるため意味をなさないが、ここではこれは何もしない。さらに、 'fflush'の後で、結果バッファにアクセスすることもできます。 –
ありがとう、ジェンス。実際に私は、これらのメモリマップされたストリームがバッファリングされておらず、バッキングメモリに直ちに書き込みが行われた結果が含まれることを期待していました。しかし、そうではありません。フラッシュが必要です。これがバッファリングされていないモードを設定しようとしていたため、これらのモードのいずれかで動作するようです。 – ddbug