次のような変数を定義したとしましょう:
static struct array myVar;
// &myVar is 0x100
宣言に触れずに住所を変更することはできますか?
あまりにも明確に、私はそれをポインタとして宣言したくありません。
// &myVar should be != 0x100
次のような変数を定義したとしましょう:
static struct array myVar;
// &myVar is 0x100
宣言に触れずに住所を変更することはできますか?
あまりにも明確に、私はそれをポインタとして宣言したくありません。
// &myVar should be != 0x100
コメントであなたは言った:
ええと、私はこれを求めています。なぜなら、C ++プログラムをデバッグしているときに、&myVarを使用して実行時にさまざまなアドレスを表示するVisualStudioを見たからです。
複数の.cppファイルに含めた.hファイルで宣言myVar
した場合、各.cppファイルに異なるアドレスが表示されます。宣言されたとおりに内部リンケージがあるためです。内部リンケージとは、各変換ユニット(.cppファイル)の変数の定義が異なることを意味します。したがって、N個の.cppファイルがある場合、基本的にそれぞれの異なるアドレスを持つN個のバージョンがあります。それは1つの可能な説明です!myVar
myVar
static
myVar
修正はこれです:
ファイル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!
myVar
いいえ、実行時にのアドレスを変更することはできません。
これを求めているのは、C ++プログラムをデバッグしているときに、VisualStudioが実行時にさまざまなアドレスを表示するのを見たからです。
&myVar
myVar
プログラムのさまざまな実行中に、さまざまなアドレスが割り当てられる可能性があります。
同じ実行中にアドレスが変更されている場合、最も可能性の高い2つの説明は次のとおりです。
myVar
ます;プログラムをコンパイルすると、コンパイラはシンボルmyVar
をメモリ内のアドレスに置き換えます。すべてのアドレスは、 -operatorstruct
でダイナミックメモリを使用する場合のように、コンパイル時または実行時に割り当てられます。new
したがって、変数のアドレスを変更することはできません。変更できれば壊滅的です。
使用しているコンパイラ/リンカ環境によって異なります。これは完全にCまたはC++標準の範囲外ですが、一部の(ほとんどではないにしても)コンパイラでは、データまたはコードの最終的な「セクション」(または同様のもの)を割り当てて、リンカーにどのアドレスを指定できるかを指定できます。 。
しかし、それはおそらく、多くの努力なしにVisualStudioのコンパイルで起こっていることではありません。