問題タブ [flexible-array-member]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 構造体への 2 つのポインターを柔軟な配列メンバーと比較する
質問: 2 つのポインターを柔軟な配列メンバーと比較して、より多く (より少なく) 等しいかどうかを比較することは正当ですか?
struct inotify_event
Linux での宣言方法は次のとおりです。
簡単にするためにサイズチェックを省略して、次のコードを考えてみましょう。
柔軟な配列メンバーを含む構造体へのポインターの比較は、常にUBだと思います(それらは同じですが)
N2346/6.7.2.1p3
(emp. mine):
複数の名前付きメンバーを持つ構造体の最後のメンバーは、不完全な配列型を持つ可能性があります。そのような構造体 (およびそのような構造体であるメンバーをおそらく再帰的に含む共用体) は、構造体のメンバーまたは配列の要素であってはなりません。
OTOH、N2346/6.5.8p5
比較される必要なポインターは同じ配列に属します:
2 つのポインターを比較すると、結果は、指しているオブジェクトのアドレス空間内の相対位置によって異なります。オブジェクト型への 2 つのポインターが両方とも同じオブジェクトを指している場合、または両方が同じ配列オブジェクトの最後の要素の 1 つ後ろを指している場合、それらは等しいと比較されます。指しているオブジェクトが同じ集合体オブジェクトのメンバーである場合、後で宣言された構造体メンバーへのポインターは、構造体で以前に宣言されたメンバーへのポインターよりも大きく、添字値が大きい配列要素へのポインターは、同じ配列の要素へのポインターよりも大きくなります。より低い添字値で。同じ共用体オブジェクトのメンバーへのすべてのポインターは等しいと比較されます。式 P が配列オブジェクトの要素を指し、式 Q が同じ配列オブジェクトの最後の要素を指す場合、ポインター式 Q+1 は P より大きいと比較されます。それ以外の場合、動作は未定義です。
N2346/6.5.8p4
OTOOH、柔軟な配列メンバーを持つ構造体の定義と矛盾することがわかりました。
これらの演算子の目的上、配列の要素ではないオブジェクトへのポインターは、要素の型としてオブジェクトの型を持つ長さ 1 の配列の最初の要素へのポインターと同じように動作します。
struct inotify_event *first_event
は配列の要素ではないN2346/6.7.2.1p3
ため、長さ 1 の配列の要素と見なすことができるため、矛盾することを意味します。N2346/6.7.2.1p3
c++ - 多態性を持つクラス内の柔軟な配列メンバー
C99では、次のようなものを持つことができます
そしてfoo* f=(foo*)malloc(sizeof(foo)+n)
、配列の長さが である構造体を持つように割り当てn
ます。
クラスが仮想関数を持つサブクラスである場合、C++ で同様のことができますか?
foo
bar のサブクラスのように、次のようにしますstd::unique_ptr<bar> f= std::unique_ptr<foo>((foo*)malloc(sizeof(foo)+n))
メモリの解放が行われるため、そのコードが機能しないことはわかっていますがdelete
、割り当てはで行われましたmalloc