これはかなりこじつけですが、次のコードは、「安全な」(つまり、セグメンテーションフォールトが発生しないことが保証)です:std :: vector :: reserve safeの後に生ポインタにアクセスしていますか?
std::vector<int> vec(1); // Ensures that &vec[0] is valid
vec.reserve(100);
memset(&vec[0], 0x123, sizeof(int)*100); // Safe?
私は、これは醜いであることを認識 - 私はそれが技術的に安全ですかどうかを知るためにのみ興味、 "きれい"ではありません。私はその唯一の用法は、指定されたインデックスを超えて格納された値を無視することができると思う。
注! How can I get the address of the buffer allocated by vector::reserve()?は同じトピックをカバーしていますが、これがの安全な場合はであり、これに落とし穴がある場合はもっと興味があります。
EDIT:オリジナルコードが間違っていました。元のmemcpy
をmemset
に置き換えました。
これは醜いので、痛いです。どうしてそんなことをするのか?あなたが本当にしなければならない場合、単に配列を使用することはできませんか?この例では100が固定されているため、[]を削除しなくてもスタック上の配列を使用することができます。 – Francesco
"Segmentation fault"はプラットフォーム固有のイベントです。 C++言語は、それが何であるかを記述していません。言葉は、何かが定義されているかどうか、そうであれば、何をするかだけを言います。 –
私は質問を落としましたが、それは悪い質問ではありませんが、あなたが求めていたことがあなたが求めていたものであることを保証するのに十分な時間がかからなかったからです(元のコードと現バージョンのコードはかなりです異なる)。-2ポイントはそれほど高くはありませんが、他の人に援助しようと答える時間を取るように、後で質問を再調整すると無駄になるのはその時ですに。 –