2017-04-01 7 views
-1

私が抱えている問題の1つは、変数を後でポイントにアクセスするためにメモリにキャストしようとすることです。ポインタキャストを使用するローカル変数

私は完璧に動作し、ここでのコード例があります:私のコードのどこにも

unsigned int *label = (unsigned int *)malloc(sizeof(unsigned int)); 
label = (unsigned int *) 0xFFAAFFAA; 

を私は、この値ラベルにアクセスすることができ、私はそれを印刷しようとすると、それは、その値として0xFFAAFFAAを指します。私は、このようなように変数から割り当てるしようとした場合

しかし、:..私はちょうどメモリ内のいくつかのランダムなアドレスであると仮定しています0x7f252d6b5f00:

//all of this is inside a method.. so any variables declared would be local 
    unsigned int localVariable = 0xFFFFFFFF; 
     unsigned int *label = (unsigned int *)malloc(sizeof(unsigned int)); 
     label = &localVariable; 

結果は以下のように狂ったものになるだろう。私はこの問題が、関数内で動作し、グローバルではないローカル変数のためであることを知っています。しかし、私はこれの構文が何であるか把握することができません...

なぜ私はローカル変数を定義したいのですが、その変数に他の論理が加減算されるためです。それを最小限に保つためにそれを出す

編集:私はこれのような何かをすることができますか?

unsigned int localVariable = 0xFFFFFFFF; 
    unsigned int *label = (unsigned int *)malloc(sizeof(unsigned int)); 
    *label = localVariable; 
+2

ここで何をしようとしていますか? 'label =(unsigned int *)0xFFAAFFAA;'は単純にポインタ自体を上書きします。 –

+0

@OliverCharlesworthこんにちはオリバー、お兄さん。基本的に私がしようとしているのは、新しい符号なしを作成することです。減算して加算してその値をポインタ –

+0

に割り当てるなど、いくつかのロジックを実行します。ビットをシフトしたり、私は通常の値でそれを行う必要があるので、それをコピーする –

答えて

0

ここでは、関数内の変数へのポインタを作成し、その関数の外部でアクセスできるようにしています。

最初の例の問題は、メモリを割り当ててそのアドレスをlabelに割り当てることですが、次にlabelの値を上書きして、割り当てたメモリへの参照が失われることがあります。 逆参照ポインタを*演算子を使用して、割り当てたメモリアドレスに書き込む必要があります。

2番目の例は、ローカル変数のアドレスを取るために機能しません。その変数は、関数が返ってきたときに範囲外になります。したがって、アドレスは無効になります。

以下の例では、スペースを割り当て、指定されたアドレスに書き込むために割り当てられたばかりのポインタを逆参照して、アドレスを呼び出し元に返します。

unsigned int *func() 
{ 
    // allocate space (don't cast return value of malloc) 
    unsigned int *label = malloc(sizeof(unsigned int)); 
    // dereference pointer and write value to allocated memory 
    *label = 0xFFAAFFAA; 
    // pass pointer to allocated memory to the calling function 
    return label; 
} 

呼び出し元の関数は、それがメモリリークを避けるためにそれを使用して行われたときに返されるメモリ上freeを呼び出すための責任があることに留意してください。

関連する問題