2016-11-15 3 views
0

私は与えられた変数のメモリアドレスを64ビット(unsigned long)まで取得する簡単なプログラムを開発中です。現在のところこれはコードですが、何らかの理由でコンパイラが私のメソッドがローカル変数のアドレスを返すという警告を私に投げかけています。関数はローカル変数[-Wreturn-local-addr]のアドレスを返します

int main(int argc, char *argv[]) 
{ 
char* one = argv[1]; 
long memaddress = address(one); 
} 

uint64_t address(char * strin) 
{ 
     return (uint64_t) &strin; 
} 

この警告を緩和するにはどうすればよいですか、この警告が表示される原因は何ですか?

+0

、なぜドンのようにそれを呼び出すことができます警告を回避するには、あなたがのために行くtをMACRO? –

+4

@SouravGhosh:機能が動作するマクロは決して使用しないでください。しかし、それはどちらかというとナンセンスです。 – Olaf

+0

@Olafだからあなたは何をするべきですか?私はアドレス機能にもっと多くの実装を計画していますが、私はできるだけシンプルに質問しました。アドレスをメインにどのように渡すのですか? – WasabiCannon

答えて

2

あなたは変数strinは、関数のローカル変数である参照として、あなたは、次のよう

long address = address(one); 
//... 
uint64_t address(void) 
{ 
     char * strin = one; 
     return (uint64_t) &strin; 
} 

関数の定義とそのコール

long address = address(one); 
//... 
uint64_t address(char * strin) 
{ 
     return (uint64_t) &strin; 
} 

を想像することができます。関数を終了すると破棄されます。したがって、関数を終了した後のアドレスは無効になります。コンパイラはこれについてあなたに警告します。

あなたは、少なくとも次のよう

uint64_t address(char ** strin) 
{ 
     return (uint64_t) &*strin; 
} 

関数を記述し、これが機能するために少しにある

long address = address(&one); 
0

strinは、addressに値渡しされるポインタです。

あなたは本質的に、別のタイプにキャストされているにもかかわらず、そのアドレスを返そうとしています。

しかし、strinのアドレスは、関数が終了するともはや有効でなくなり、あなたの友好的なコンパイラがそれを警告します。

解決策はアドレスとしてvoid*を使用することです。まったく異なるもの用に設計されたタイプではありません。

0

変数を関数に渡すと、変数のコピーが作成され、それをローカル変数として呼び出す関数に渡します。この変数のアドレスを返すと、返す関数のローカル変数の位置がから取得されます。つまり、one変数の場所は取得されませんが、この例ではstrinになります。

2

パラメータstrinaddress関数にローカルであり、main関数に無効なポインタ値、したがって警告を行う、場合addressリターンを消滅します。

関連する問題