問題タブ [variable-length-array]

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.

0 投票する
3 に答える
5765 参照

c - C で動的に割り当てられた構造体の配列

以下が機能するかどうかを知りたかっただけです。foo次のように定義されている構造体があります。

実行時に、サイズがファイルの入力から受け取る値に依存する上記の構造体の配列を作成する必要があります。このサイズを としましょうk。次のコードは、動的にサイズ変更された構造体の配列を適切に割り当てますか?

編集:これらの配列内の構造体のメンバーにアクセスしたい場合、フォーマットを使用しますfooarray[someindex].memberか?

0 投票する
1 に答える
641 参照

c - 可変長配列の割り当てをアサートする

重複の可能性があることをお詫び申し上げます(それに対する答えを見つけることができませんでした):

可変長配列の割り当てが正常に完了したことを確認する必要がありますか?

例えば:

答えがyesであることは明らかですが、構文arr == NULLは少し変わっているように感じます。

ありがとう


アップデート:

上記のコードがコンパイルされることさえ確認していないという事実を認めます (コンパイルされると仮定します)。

コンパイルされない場合は、可変長配列の割り当てをアサートする方法がないことを意味します。

したがって、割り当てが失敗すると、プログラムはすぐにクラッシュすると思います。

プログラムが不正なメモリ アクセス (読み取りまたは書き込み) の後にクラッシュするのは理にかなっていますが、メモリの割り当てが失敗した後ではないため、これは非常に厄介なケースです。

または、割り当てによって何も起こらないかもしれませんが、スタックの外側に「落ちる」エントリで配列にアクセスするとすぐに、メモリアクセス違反が発生する可能性があります (スタックオーバーフローのように)...?

正直なところ、VLA にさらにローカル変数 (特に他の VLA) が続く場合、VLA がスタックにどのように割り当てられるかさえわかりません。そのため、その問題についても回答をいただければ幸いです。

0 投票する
2 に答える
202 参照

c - コンパイラは、可変長配列の後に宣言された変数のアドレスをどのように解決しますか?

可変長配列を使用する次の関数があるとします。

コンパイラは のアドレスをどのように決定しますvar2か?

私が考えることができる唯一の方法は、 と のarrvar1に配置することvar2です。

しかし、その場合、複数の可変長配列があった場合はどうなるでしょうか?

それらをすべて「通常の」変数の後に配置すると、最初のアドレスの解決に役立つだけです。

ここでの私の暗黙の仮定は、すべてのローカル変数 (VLA を含む) がスタックに割り当てられているということです。

C99標準で定義されていないことを認識しているため、問題は本質的にコンパイルに関するものです。

0 投票する
1 に答える
151 参照

c++ - 動的および静的メモリ割り当て?

プログラムはスタック上の配列に未知のメモリを割り当てようとするため、コードをコンパイルしてはなりませんが、コンパイルされます! 私は動的メモリが何であるかを知っています.私はこれについてたくさん読んだことがありますが、理解できません.なぜ上記のプログラムが実行されるのですか?! このままでいいのではないか?:

静的割り当てでは機能せず、動的割り当てでのみ機能する例を教えてください。

0 投票する
1 に答える
106 参照

c++ - 動的サイズの文字の静的配列

サイズが実行時に定義される文字の静的配列を作成しています。そして、コンパイルエラーが発生しません。
これはどのように可能ですか?
これが私の例です:

0 投票する
0 に答える
73 参照

c++ - C++ 定数変数を使用して配列サイズを初期化する

G++ コンパイラでは、次のような配列の初期化が許可されていることに気付きました。

配列 subPalins のサイズは、定数変数である len です。コンパイル時に配列のサイズを決定する必要があるため、可変サイズの配列を初期化することは許可されていないことを覚えています。ここのlenは定数ですが、それでも変数であり、なぜこれが許可されているのかわかりません。

0 投票する
2 に答える
1108 参照

c - malloc なしの完全なカプセル化

私は C11 と VLA を試していて、不完全な宣言だけでスタック上に構造体変数を宣言しようとしました。目的は、(PIMPL イディオムのように) 内部を表示せずに、構造体型の変数を作成するメカニズムを提供することですが、ヒープ上に変数を作成してポインターを返す必要はありません。また、構造体のレイアウトが変更された場合、構造体を使用するすべてのファイルを再コンパイルしたくありません。

私は次のようにプログラムすることができました:

private.h:

public.h:

実装.c:

main.c:

このコードをテストしましたが、うまくいくようです。ただし、危険または移植性がなく、パフォーマンスを損なう可能性のあるもの (エイリアシング、アライメントなど) を見落としているかどうかはわかりません。また、C でこの問題に対するより良い (移植可能な) 解決策があるかどうかも知りたいです。

0 投票する
3 に答える
189 参照

c - 次の 2 つの方法のうち、静的配列に次元を与える正しい方法はどれですか?

これら 2 つの形式の配列宣言は正しいですか?

初め:

2番:

私にとって2つの方法は完全に有効ですが、最初の方法が間違っていると誰かが言いました。

最初のものは次のように言っています。

したがって、私にとっては、最初のものが無効であると言うのはあまり意味がありません。

しかし、それについて完全に確信するために、私はここでそれを尋ねたかった. それは単にプログラミングスタイルに関するものですか、それとも最初のものはそれを行う正しい方法ではありませんか?

ありがとうございました。