問題タブ [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 - Cの悪い習慣で柔軟な配列メンバーを使用していますか?
私は最近、C で柔軟な配列メンバーを使用することは、ソフトウェア エンジニアリングの実践として不適切であると読みました。しかし、その声明はいかなる議論にも裏付けられていませんでした。これは受け入れられた事実ですか?
(柔軟な配列メンバーは、C99 で導入された C の機能であり、最後の要素を未指定のサイズの配列として宣言できます。例: )
c++ - 長さゼロの配列
私はいくつかの古いコードのリファクタリングに取り組んでおり、長さゼロの配列を含む構造体をいくつか見つけました (以下)。もちろん、プラグマによって抑制された警告ですが、そのような構造を含む「新しい」構造を作成できませんでした (エラー 2233)。配列 'byData' がポインターとして使用されていますが、代わりにポインターを使用しないのはなぜですか? または長さ1の配列?そしてもちろん、プロセスを楽しむためのコメントは追加されていません...そのようなものを使用する理由はありますか? それらをリファクタリングする際のアドバイスはありますか?
注意: C++、Windows XP、VS 2003 です。
c - C構造の柔軟な配列メンバー
C-std セクション 6.7.2.1 から引用すると、
これは有効な構造宣言です。この種の構文の実用的な使用法を探しています。正確に言えば、この構造は double* を 2 番目の要素として保持するよりも、どのように多かれ少なかれ強力なのでしょうか? それとも、これは「複数の方法で実行できる」別のケースですか?
アルパン
c++ - 柔軟な配列メンバーはC++で有効ですか?
C99では、構造体の柔軟な配列メンバーを次のように宣言できます。
しかし、ここで働いている誰かがC ++でclangを使用してコードをコンパイルしようとすると、その構文は機能しませんでした。(MSVCで動作していました。)次のように変換する必要がありました。
C ++標準を調べたところ、柔軟なメンバー配列への参照はまったく見つかりませんでした。私はいつも[0]
無効な宣言だと思っていましたが、柔軟なメンバー配列の場合は明らかに有効です。柔軟なメンバー配列は実際にC++で有効ですか?もしそうなら、正しい宣言[]
ですか[0]
?
arrays - 動的配列と柔軟な配列
異なる言語からの良い例を事前に感謝して、これら2つのタイプの配列の違いは何ですか
objective-c - 可変長配列を使用する場合の Objective-C EXEC_BAD_ACCESS
私が見つけたいくつかの動作についていくつかのテストを行いました.誰かが何が起こっているのかを理解するのを手伝ってくれるかどうか疑問に思っていました.
myStruct
次のようなと呼ばれる構造体があります。
そして、このコードを実行します:
それは正常に動作します。ただし、構造体宣言を次のように変更すると:
回線を呼び出すと、EXEC_BAD_ACCESS が返されます[a release]
。
ここで何が起こっているのかを理解してくれる人はいますか?
c - サイズがゼロの柔軟な配列メンバーを作成することは合法ですか?
C99 標準では、次のような柔軟な配列メンバーを作成できます。
これは、次のようなもので初期化されますpstring* s = malloc(sizeof(pstring) + len)
。len
をゼロにすることは許されますか? それは一貫しているように見え、時々スペースを節約するのに適しています(pstring
もちろん、おそらく例ではありません)。一方、次のコードが何をするのかわかりません。
これはまた、あるコンパイラーでは動作するが別のコンパイラーでは動作しない、またはある OS では動作し、別の OS では動作しない、またはある日と別の OS では動作しないようなものであるように思われるので、私が本当に知りたいのは、標準がこれについて何を述べているかです。それmalloc
はサンプルコードの未定義の動作s->string
ですか、それとも無効なアクセスのみですか、それともまったく別のものですか?
c++ - Objective-C++ の iOS での柔軟な配列メンバー
私はいくつかのコア オーディオ コードに取り組んでおり、構造体の可変配列 (柔軟な配列メンバー) によって解決できる問題があります。少し調べてみると、Flexible Member Array の移植性と実行可能性について多くの議論があることがわかりました。
私の理解では、Objective-C は C99 に準拠しています。このため、柔軟な配列メンバーは優れたソリューションになるはずです。また、柔軟な配列メンバーは C++ ではお勧めできません。
Objective-C++ で何をすべきか? 技術的には、Objective-C++ では使用しません。私は C および C++ ベースのコールバックを書いています... それは反対のようです。
とにかく、私はそれをすることができますか?そうでない場合、同じ結果が得られる別の手法はありますか?
c - あまりにも少ないスペースを割り当てても安全ですか (必要ないことがわかっている場合)。
そのため、C99 は、一般的に使用される「柔軟な配列メンバー」ハックをstruct
祝福して、サイズ要件に合わせて過剰に割り当てられる s を作成できるようにしました。これを行うことはほとんどの正常な実装で完全に安全だと思いますが、特定の状況で a の一部のメンバーが必要ないことがわかっている場合、C で「過小割り当て」することは合法struct
ですか?
抽象的な例
タイプがあるとします:
の場合data_is_x
、 の型はメンバーdata
を使用する必要がある型です。pos
それ以外の場合、これを操作する関数は、のこの特定のコピーのメンバーをstruct
必要としません。本質的に、 はメンバーを持っているかどうかに関する情報を保持し、この情報はの有効期間内に変更されません (悪意のあるいたずら以外では、とにかくほとんどすべてが壊れます)。言うのは安全ですか:pos
struct
struct
pos
struct
pos
メンバーが必要な場合にのみメンバーにスペースを割り当てるのはどれですか? struct
それとも、問題のメンバーを使用したことがない場合でも、ポインタに対して小さすぎるキャスト空間を使用するという制約に違反していますか?
具体例
私の実際のユースケースは少し複雑です。主にここにあるのは、なぜ私がこれをやりたいのかを理解できるようにするためです。
for のコードはmylist_create
、 forが項目長 (項目が何であれ) である連続したデータの配列であるがsize > 0
、 forは項目を含む双方向リンク リストの現在のノードであることを指定します。sで動作するすべての関数は、. 存在する場合、データをリンクされたリストとして処理し、「現在の」インデックスがノードを指すようにします。そうでない場合は、「現在の」インデックスが に格納された配列としてデータを処理します。data
size
size == 0
mylist
size == 0
data
pos
メンバーがsize == 0
本当に必要ない場合ですが、必要な場合は. だから私の質問は、これを行うことは合法ですか:pos
size > 0
(未定義の動作のペナルティで) ながら、メンバーにアクセスしようとしない (またはアクセスする必要がない) ことを保証する場合は? それとも、これを行うことを考えるのはUBであると標準のどこかに書かれていますか?size == 0
pos
c - 柔軟な配列メンバーで構造体を初期化する方法
私は次の構造を持っています
を使用せずにインスタンスを作成し、柔軟な配列メンバーで構造を初期化する方法について、いくつかの基本的なインターネット検索を行いました (ただし失敗しました) malloc()
。
例:次のような通常の構造の場合
のインスタンスを作成し、次のstruct a
ように初期化できます
しかし、(上記のように) 柔軟な配列を含む構造体_person
の場合、どのようにインスタンスを作成し、通常のように初期化できますstructures
か?
それは可能ですか?もしそうなら、初期化中に配列サイズと初期化される実際の値をどのように渡すのでしょうか?
(また)
柔軟な配列を持つ構造体を作成する唯一の方法はmalloc()
、C99 仕様で言及されているように使用することであるというのは本当6.7.2.1 Structure and union specifiers - point #17
ですか?!