タグ付けされた質問 「local-variables」

20
ローカル変数のメモリにスコープ外でアクセスできますか?
次のコードがあります。 #include <iostream> int * foo() { int a = 5; return &a; } int main() { int* p = foo(); std::cout << *p; *p = 8; std::cout << *p; } そして、コードは実行時例外なしで実行されています! 出力は 58 それはどのようになりますか?ローカル変数のメモリは、その関数の外ではアクセスできませんか?

8
ifステートメントで初期化された変数のスコープは何ですか?
私はPythonを初めて使用するので、これはおそらく簡単なスコープの質問です。Pythonファイル(モジュール)の次のコードは、少し混乱しています。 if __name__ == '__main__': x = 1 print x x変数はifステートメントに対してローカルであり、その外部に存在してはならないため、私が使用していた他の言語では、このコードは例外をスローします。しかし、このコードは実行され、1が出力されます。誰でもこの動作を説明できますか?モジュールで作成されたすべての変数は、モジュール全体に対してグローバル/使用可能ですか?


2
Delphiプログラムまたはコンパイラが生成したデバッグ情報からローカル変数情報(アドレスとタイプ)をどのように抽出しますか?
私の目標は: Delphiでコンパイルされた32ビットまたは64ビットのWindowsプログラムで中断されたスレッドを指定して、スタックをウォークする(実行可能) スタックエントリを指定して、各メソッドのローカル変数とその値を列挙します。つまり、少なくとも、それらのアドレスとタイプ(integer32 / 64 / signed / unsigned、string、float、record、class ...)を見つけ、それらの組み合わせを使用して値を見つけることができます。 1つ目は問題ありませんが、この質問に関する2つ目です。高レベルで、Delphiのスタックエントリを指定してローカル変数をどのように列挙しますか? 低レベルでは、これは私が調査してきたものです: RTTI:メソッドに関するこの種の情報はリストしません。これは、私が実際に現実的な選択肢であると思ったものではありませんでしたが、とにかくここにリストします。 デバッグ情報:デバッグビルド用に生成されたデバッグ情報をロードします。 マップファイル:詳細なマップファイル(テキスト形式のファイルです。ファイルを開いて確認してください)にも、ローカル変数情報は含まれていません。基本的には、アドレスとソースファイルの行番号のリストです。アドレスとファイルの行の関連付けに最適です。たとえば、樋の青いドットです。より詳細な情報には不向き リモートデバッグ情報(RSMファイル)- その内容や形式に関する既知の情報はありません。 TD32 / TDSファイル:現在の研究内容。それらは他の多くの情報の中でグローバルとローカルのシンボルを含んでいます。 ここで遭遇する問題は次のとおりです。 TD32ファイル形式のドキュメントはありません(見つけられます)。 それらに関する私の知識のほとんどは、それらを使用するJedi JCLコード(JclTD32.pas)からのものであり、そのコードの使用方法や、ローカル変数を表示するのに十分な構造があるかどうかはわかりません。私はそれがグローバルシンボルを処理することを確信していますが、ローカルについては非常に不確かです。多種多様な定数が定義されており、形式に関するドキュメントはありません。それらが何を意味するかを読むために、私は推測しておきます。ただし、これらの定数とその名前はどこかに由来している必要があります。 TDS情報を使用して見つけることができるソースは、ローカルシンボルをロードまたは処理しません。 これが正しいアプローチである場合、この質問は「TDS / TD32ファイル形式のドキュメントはありますか?ローカル変数をロードするコードサンプルはありますか?」 コードサンプルは必須ではありませんが、最小限の場合でも非常に便利です。

9
Cでの文字列リテラルの「ライフタイム」
次の関数によって返されるポインタにアクセスできませんか? char *foo(int rc) { switch (rc) { case 1: return("one"); case 2: return("two"); default: return("whatever"); } } つまり、C / C ++のローカル変数の存続期間は、実際には関数内だけですよね?つまり、char* foo(int)終了した後、それが返すポインタはもはや何も意味しませんよね? ローカル変数の存続期間について少し混乱しています。良い説明は何ですか?

2
ArrayBlockingQueueで、最終メンバーフィールドをローカルの最終変数にコピーするのはなぜですか?
ではArrayBlockingQueue、ロックを必要とするすべてのメソッドは、をfinal呼び出す前にロックをローカル変数にコピーしますlock()。 public boolean offer(E e) { if (e == null) throw new NullPointerException(); final ReentrantLock lock = this.lock; lock.lock(); try { if (count == items.length) return false; else { insert(e); return true; } } finally { lock.unlock(); } } フィールドがであるときにthis.lockローカル変数lockにコピーする理由はありますか?this.lockfinal さらに、E[]アクションを実行する前にのローカルコピーも使用します。 private E extract() { final E[] items = this.items; …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.