0

次のような変数を定義したとしましょう:

static struct array myVar;
// &myVar is 0x100

宣言に触れずに住所を変更することはできますか?
あまりにも明確に、私はそれをポインタとして宣言したくありません。

// &myVar should be != 0x100
4

4 に答える 4

3

コメントであなたは言った:

ええと、私はこれを求めています。なぜなら、C ++プログラムをデバッグしているときに、&myVarを使用して実行時にさまざまなアドレスを表示するVisualStudioを見たからです。

複数の.cppファイルに含めた.hファイルで宣言myVarした場合、各.cppファイルに異なるアドレスが表示されます。宣言されたとおりに内部リンケージがあるためです。内部リンケージとは、各変換ユニット(.cppファイル)の変数の定義が異なることを意味します。したがって、N個の.cppファイルがある場合、基本的にそれぞれの異なるアドレスを持つN個のバージョンがあります。それは1つの可能な説明です!myVarmyVarstaticmyVar

修正はこれです:

  • ファイルexternの代わりに変数を宣言しstaticます。.h

     //file.h
     extern struct array myVar; //it is just a declaration
    
  • 次に、1つのファイルで、キーワード.cppなしで定義します。static

     //anyfile.cpp
     struct array myVar; //it is a definition!
    
于 2013-03-26T09:10:07.673 に答える
2

myVarいいえ、実行時にのアドレスを変更することはできません。

これを求めているのは、C ++プログラムをデバッグしているときに、VisualStudioが実行時にさまざまなアドレスを表示するのを見たからです。&myVar

myVarプログラムのさまざまな実行中に、さまざまなアドレスが割り当てられる可能性があります。

同じ実行中にアドレスが変更されている場合、最も可能性の高い2つの説明は次のとおりです。

  • 複数ありmyVarます;
  • デバッガーがアドレスを正しく表示していません。
于 2013-03-26T09:05:09.670 に答える
0

プログラムをコンパイルすると、コンパイラはシンボルmyVarをメモリ内のアドレスに置き換えます。すべてのアドレスは、 -operatorstructでダイナミックメモリを使用する場合のように、コンパイル時または実行時に割り当てられます。newしたがって、変数のアドレスを変更することはできません。変更できれば壊滅的です。

于 2013-03-26T09:09:10.090 に答える
0

使用しているコンパイラ/リンカ環境によって異なります。これは完全にCまたはC++標準の範囲外ですが、一部の(ほとんどではないにしても)コンパイラでは、データまたはコードの最終的な「セクション」(または同様のもの)を割り当てて、リンカーにどのアドレスを指定できるかを指定できます。 。

しかし、それはおそらく、多くの努力なしにVisualStudioのコンパイルで起こっていることではありません。

于 2013-03-26T09:13:38.063 に答える