0

私はこの質問に対する答えを探していましたが、少し難しいです。

だからそうなるのです!

    int square(int* a){
      return (*a)*(*a)
    }


    int main(){
      int b = 20;  
      square(&b);
    }

私の質問は: 変数 a と b はどこに保存されていますか?

私の意見では、変数 b はスタックに格納されていますが、a に関していくつか質問があります。

square(&b) を呼び出すと、参照が渡されます。この場合、スタック内の変数 b のアドレスです。

次に、関数 square(int* a) は (int* a) 引数を受け取ります。これは、この場合はスタック内の変数 b の参照であるポインターを受け取ることを意味します。したがって、変数 a の値は変数 b のアドレスになります。ただし、両方ともスタックに格納されます。私はそれがスタック上にあると確信していますが、...または、bがスタックにあり、aがヒープにあるのでしょうか? ところで、ありがとう。

4

2 に答える 2

3

bはスタックになります。

squareが呼び出されたとき、a&bは同じ値です。呼び出し規約とコンパイラの最適化に応じて、この値はレジスタ、スタック、またはその両方にある場合があります。

于 2013-06-08T01:47:48.487 に答える
1

あなたは正しいです!bはスタックにプッシュされ、 へのa単なるポインタbであるため、 の参照bとポインタaが保持する値は同じ値であり、これが のスタック位置ですb。ただし、'a'関数が呼び出された後、ポインターはスタックに留まりません。スコープ外に'b'なりますが、値は変更されますが、関数が呼び出された後もスタックに残ります。

于 2013-06-08T01:38:20.930 に答える