C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++ポインタを使用して別の関数からローカル変数にアクセスするにはどうすればよいですか?


スコープ外になると、ローカル変数にアクセスできなくなります。これがローカル変数であることの意味です。ただし、スコープ外のローカル変数のメモリにアクセスできる可能性がある例を見てみましょう。

#include<iostream>
int* foo() {
   int x = 3;
   return &x;
}
int main() {
   int* address = foo();
   cout << *address;
   *address = 12;
   cout << *address;
}
出力 これにより出力が得られる可能性があります-

3
12

前に述べたように、このコードは機能する可能性があります。 xのアドレスとして使用されたメモリの読み取りと書き込みを行っているだけです。主に、あなたはfooのスコープ外にいます。アドレスは、ランダムなメモリ領域へのポインタです。上記の例では、そのメモリ領域は存在し、現時点では他に何も使用されていません。使い続けることで何も壊すことはなく(別のプロセスのメモリ領域やその他の無許可のメモリ領域を使用することはありません)、他に何も上書きされていません。したがって、3はまだそこにあります。

実際のプログラムでは、そのメモリはほとんどすぐに再利用された可能性があり、このようなことで何かを壊してしまいます。このようなメモリアクセスのバグは、追跡して殺すのが非常に困難です。

fooから戻ると、プログラムはOSに、xのメモリが使用されなくなったことを通知し、他のメモリに再割り当てできるようにします。運が良ければ、それが再割り当てされ、OSがそれを再び使用していることに気付かない場合は、それを回避することができます。


  1. C ++を使用してOpenCVで画像を異なるチャネルに分割するにはどうすればよいですか?

    RGBイメージには、赤、緑、青の3つのチャネルがあります。赤、緑、青のチャンネルが画像を表す色空間は、RGB色空間と呼ばれます。 OpenCVでは、RGBの代わりにBGRシーケンスが使用されます。これは、最初のチャネルが青、2番目のチャネルが緑、3番目のチャネルが赤であることを意味します。 RGB画像を異なるチャネルに分割するには、3つのチャネルのマ​​トリックスを定義する必要があります。 Matdifferent_Channels[3]を使用します 3チャネルマトリックスを定義します。 次に、OpenCVのsplit()関数を使用して、ロードされた画像を分割します。この関数の形式はspli

  2. C ++を使用してOpenCVで画像をロードして表示するにはどうすればよいですか?

    このトピックでは、C++でOpenCVを使用して画像を読み込んで表示する方法を決定します。 OpenCVで画像を読み込んで表示するには、次の機能が必要です。 マット: マットは機能ではありません。これはデータ構造であり、変数の一種です。 C ++のint、char、string変数タイプと同様に、MatはOpenCVの変数であり、その中に画像をロードするためのマトリックスデータ構造を作成します。このプログラムでは、「MatmyImage;」と書きました。 これは、myImageという名前の行列変数を宣言していることを意味します。 namedWindow(): メモリを割り当て、画像を