問題タブ [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 投票する
4 に答える
5822 参照

c - 可変長配列のプロトタイプ

c で可変サイズの配列を取る関数を作成しようとしています。

可変長配列の場合、関数宣言で制限する必要があると書かれています。どういう意味ですか?私はLLVMコンパイラ2.0でxcode 4.0を使用しています。

助けてくれてありがとう。

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

c - 可変長配列を使用しても安全ですか?

可変長配列について懸念があります。配列を動的に割り当てたい場合、十分なメモリを割り当てることができず、プログラムでこれに適切に応答できる場合は、null になります。可変長配列では、この情報を取得できません。これをどうすればいいですか?

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

c - C でサポートされていない可変長配列 C99

Visual Studio 2005 で、.c ファイルをコンパイルしようとしています。

動作しません。コンパイラはどの標準に従っていますか?

0 投票する
6 に答える
26783 参照

c - ISO C90 は可変長配列を禁止しています

配列のサイズを動的に計算しています。何かのようなもの:

しかし、GCCコンパイラだけが言う:

SOで検索すると、この答えが見つかりました:

C99 §6.7.5.2:

サイズが整数定数式ではない式の場合... ...評価されるたびに、ゼロより大きい値を持つ必要があります。

そこで、サイズ制限型変数を次のように再宣言しました。

しかし、それは私に警告を与え続けています。これは GCC のバグですか?

0 投票する
4 に答える
11732 参照

c - C で可変長配列をグローバル変数として宣言する

可変長配列をグローバル変数として宣言するにはどうすればよいですか?

長さがスキャンされる前に可変長配列が関数で宣言されると、コンパイルはされますが実行されません。セグメンテーション違反が発生します。同じ宣言ステートメントがスキャンステートメントの下にシフトされると、正常に実行されます。

可変長配列をすべての関数でグローバルに使用できるようにしたい場合は、どうすればよいでしょうか? ここでの問題は、配列の長さが特定の関数でしかスキャンできないことです。

0 投票する
9 に答える
42965 参照

c - 配列タイプとmallocで割り当てられた配列の違い

今日、私は友人のCコードを手伝っていましたが、なぜそれが起こったのか説明できない奇妙な行動を見つけました。整数のリストと各行を含むTSVファイルがありましたint。最初の行は、リストに含まれていた行数でした。

また、非常に単純な「readfile」を含むacファイルもありました。最初の行は行数であると読み取られn、次に次の初期化が行われました。

nそして最後に。のforループfscanf

小さいn(〜100.000まで)の場合、すべてが正常でした。ただし、nが大きい場合(10 ^ 6)、セグメンテーション違反が発生することがわかりました。

最後に、リストの初期化を次のように変更しました

非常に大きい場合でも、すべてがうまくいきますn

誰かがこれが起こった理由を説明できますか?int list[n]使用を開始したときに停止したセグメンテーション違反の原因は何list = malloc(n*sizeof(int))ですか?

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

c++ - クラス スコープで動的に割り当てられたスタック メモリ

いくつかのコンパイラは C++ の拡張機能をサポートしており、スタックにメモリを動的に割り当てることができます。たとえば、VLA と同様にg++サポートします。alloca()これらの拡張機能にはすべて、動的に割り当てられたメモリが呼び出し元の関数のスコープの最後で "割り当て解除" されるという注意事項があります。(編集:明確にするために、「割り当て解除」を引用符で囲みます。実際に起こっているのは、コンパイラがスタックポインターをデクリメント/インクリメントしているため、alloca()コンパイラのサポートが必要な理由です。)これはalloca()、クラスのコンストラクター内で割り当てられたメモリが割り当て解除されることを意味します。コンストラクターが戻るとすぐに。

この制限は、コンストラクターが割り当てるメモリの量を決定するためにいくつかの重要な手順を実行するクラスで対処するのが非常に困難になります。クラスのユーザーは、クラスの構築元の関数にメモリを割り当てる必要があります。これにより、おそらく公開すべきではない内部構造が公開されます。さらに、コードalloca()や VLA を使用できるようにするための回避策をコードに入れることは、一般的に不便です。

alloca()、VLA、またはその他の言語拡張機能を使用して、クラス内でメモリを割り当て、クラス スコープを持つことができるように、この制限を回避する方法を考えてもらえますか?

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

objective-c - Objective-C の可変サイズの配列?

さて、どうやらこれはうまくいく:

これは本当に合法ですか?つまり、コンパイルするためです(Cコンパイラが非定数として拒否する場合)。私の質問の最初の部分は次のとおりです。これはどのように機能しますか? スタックに割り当てていると思いますか?これは使用とは異なりalloca()ますか?

実際には、これを行うコードをいくつか見つけました。

これは機能します。fooただし、バッファーの割り当てをループ内から関数の最初の行 (が宣言される直前) に移動すると、関数は... 動作を停止します。デバッガーでは、ローカル変数の最初のアクセスに到達し、その後...終了します。スローされる例外は見られず、クラッシュせず、プログラムが実行を続けるだけです (実際には、関数は文字列を返し、その戻り値はNULL、戻り変数が初期化されるものです)。何が起こっているのかわかりません。私の質問の 2 番目の部分は、最初の部分に照らして、一体何が起こっているのかということです。