は、私は現在、その一般的な構造のようになります小さなCプログラムをデバッグしようとしています。しかし、このブレークポイントでスタックフレームを調べると、変数buf_len
がローカルスコープで既に存在し、任意の(?)値を持つことさえあります。変数がこの関数の前のどこにでも宣言されていない場合、これはどのように可能ですか?宣言/割り当てを組み合わせる前にローカル変数を使用できますか?</p> <pre><code>int some_function(...) { ... size_t buf_len = some_other_function(...) ... } main() { ... int foo = some_function(...) ... } </code></pre> <p>私は(lldbを使用して)<code>some_function()</code>にブレークポイントを設定しました:
答えて
§6.2.4/6 of the C11 Draft Standardによれば、可変長配列型を持たないようなオブジェクトについて
、 寿命は、そのブロックの実行中に終了するまで 関連付けられているブロックへのエントリから延びていますいずれにしても。
だから、buf_len
瞬間の実行がsome_function()
入るデバッガで表示されていることは驚くことではありません。
私は実際にスタックフレームの作成を誤解していました。あなたの説明をお寄せいただきありがとうございます。 – user8793
これは標準用です。しかし、変数が最適化されていれば、OPはスタックフレーム内に変数を見つけられないという驚きを得るでしょう。 –
@Frankie_C - 私はあなたのポイントを見失う。 OPは期待されていないときに見える変数について尋ねられました。この回答はOPの投稿された質問に対処しています。スタックフレームに関する概念などは、いくつかのインスタンスで動作を説明するのに必要な可能性のある実装の詳細ですが、これは標準で実装されているすべての実装についてきちんと説明されています。 –
コンパイル時に、各変数がシンボルテーブルに追加されます。 このため、変数への参照は、すでに宣言されていてシンボルテーブルに挿入されている場合にのみ解決されます。宣言の前に変数を参照すると、未定義参照のエラーが発生します。
しかし、すべての自動変数のスペースには、関数プロローグ中にスタック内にが割り当てられています(つまり、IA32-64アーキテクチャでは、すべての自動変数で必要なスペースは、スタックフレーム内のポインタレジスタ)。必要なスペースは、その関数のシンボルテーブルに存在するすべての自動変数に必要なメモリスペースを合計することによって、コンパイラによって計算されます。
実際にスタックフレームが関数入力時に作成されると、後で使用されてもすべての自動変数が存在します。
場合によっては、変数は割り当てられません。コンパイラがそれらを最適化する場合、コードを最適化するコンパイラは、変数を使用する別の方法を選択します(つまり、レジスタを使用するか、 。
- 1. C++:マップ<string, int>をイテレータを使用してベクトル<map <string, int>>にプッシュバックしますか?
- 2. のJava SWT:</p> <pre><code>GC.drawLine(int x1, int y1, int x2, int y2); </code></pre> <p>どのように私はラインの色を変更します:私は使用して線を描画していた場合GC.drawline
- 3. cat << EOFの代わりに<< EOFを使用してみませんか?
- 4. argv []をintとしてどのように取得できますか?私はこれを行う</p> <pre><code>int main (int argc, char *argv[]) { printf("%d\t",(int)argv[1]); printf("%s\t",(int)argv[1]); } </code></pre> <p>とシェルで:
- 5. 私はint型のペアを含むセットを持っている場合は、</p> <pre><code>set<pair<int,int> > cells; </code></pre> <p>は、どのように私は「検索」を使用して設定でペアを抜けるかどうかを見つけることができ++
- 6. std :: vectorを使用するときに割り当てるcudaMalloc()<int *>
- 7. std :: map <tstring <std :: map <tstring、unsigned int >>割り当てが失敗しました
- 8. 下にある容器は何ですか?私はすでにそれを使用して動作しますが、私は本当にないんだけど</p> <pre><code>std::priority_queue<int, std::vector<int>, std::greater<int> > pq; </code></pre> <p>:
- 9. 読み取り専用ディクショナリ<int、List <int>>
- 10. ベクトル<vector<int>を使用しようとしました
- 11. は私だけ前を使用した値の型</p> <pre><code>map<int id, struct_t*> table struct_t { int prev; int wt; string name; } </code></pre> <p>などの構造体とのマップを持って、マップC++
- 12. std :: function <int(int)>をstd :: function <const int&(const int&x)>に割り当てる
- 13. constポインタをintに宣言しますか?</p> <pre><code>int* p1; // pointer to int const int* p2; // pointer to constant int int* const p3; // constant pointer to int const int* const p4; // constant pointer to constant int </code></pre> <p>とDに:私たちは、次のしているC++では
- 14. なぜ値を持つ定数にオプションの型を使用しますか?</p> <pre><code>let optionalInt: Int? = 9 </code></pre> <p>は、なぜあなたは、この定数の型として<code>Int?</code>を使用します。
- 15. カスタムコンパレータ<int型、ペア<int, int>>
- 16. ベクトル<int> v(istream_iterator <int>(cin)、istream_iterator <int>());
- 17. のAndroid Studioの3.0 Goが、私は、Android Studioは3.0にアップグレードされるまで</kbd> oを組み合わせ<kbd>シフト</kbd> + <kbd>コマンド</kbd> + <kbd>を使用してファイルにジャンプするために使用
- 18. 'System.Collections.Generic.KeyValuePair <int、dynamic>'を 'System.Collections.Generic.Dictionary <int、dynamic>に変換できません。
- 19. param_typeコンストラクタがランダムな分布に対して明示的になるのはなぜですか?</p> <pre><code>int main() { std::random_device engine; std::uniform_int_distribution<size_t> dis; std::cout << dis(engine, {0, 5}) << std::endl; } </code></pre> <p>をしかし、それはエラーメッセージで失敗します:
- 20. 定義、初期化、および使用方法 - ベクトル<ベクトル<ペア< int,int >、int>> v C++では?
- 21. 範囲<Int>を<Int>に変換する方法?
- 22. Haskellは私は私が試してみましたリターンタプルに取得できますか</p> <pre><code>data Error a = Woops | Nice a deriving (Eq, Ord, Show) mixIt :: Int -> Int -> (Error (Int, Int)) </code></pre> <p>(エラーがデータ型である)としてHaskellの関数を定義したタプル
- 23. sedを使用して<? <?php
- 24. 式を作成します。式<Func <IMyclass、int >>
- 25. パッケージ私が見て</p> <pre><code>package main </code></pre> <p>を開始して実験し</p> <pre><code>func main() </code></pre> <p>を持ってきた「メイン」とFUNC「メイン」
- 26. 辞書<String、SomeEnum>をLINQを使用して辞書<String,Int>に変換しますか?
- 27. ラムダ型をint => IEnumerable <string>> int =>タスク<IEnumerable <string> >>に変換しますか?
- 28. 私は機能</p> <pre><code>void make_zero(int matrix[][],int row,int col) { int row, col; int i,j; for(i=0;i<row;i++) { for(j=0;j<col;j++) { if(matrix[i][j]==0){ printf("%d %d\n", i, j); } } } </code></pre> <p>を使用してみました
- 29. ベクトル<vector <pair <int, int>>を特定のサイズで挿入し、要素を挿入することを宣言しますか?
- 30. は、メモリを割り当て、私は</p> <pre><code>int main(int argc, char **argv) { char *test = (char*) malloc(12*sizeof(char)); test = "testingonly"; free(test); } </code></pre> <p>作業isnt't理由を次のコードを思っていたC
スタックフレームには、ローカル変数や他のものに*および*で渡されたargsが含まれています。 – babon
@babon関数でブレークポイントを設定することを誤解していますか?私はそれが基本的にスタックフレームが関数の引数を知っているはずだが、その関数で作成された新しい変数ではない、その関数の最初の行で停止するためのショートカットだと思った。それは間違っていますか? – user8793
私のコンパイラコースを覚えている限り、スタックフレームのサイズはコンパイル時に計算されます。そのことから、 'buf_length'は既にスタックフレームに"予約された位置 "を持つ可能性があります。つまり、 'some_function'を呼び出すと、スタックフレームが割り当てられ(すなわちspが増加します)、lldbはすでに' buf_length'の位置を出力します。誰かによって確認されるために、これはちょうど推測です... – Bromind