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

ローカル変数のメモリは、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. Window上のc++のトップIDEは何ですか?

    大きなプロジェクトは、単なるテキストエディタでは管理が困難です。このような場合にIDEを使用すると、生産性が向上し、フラストレーションが軽減される可能性があります。 IDEにはさまざまな種類があり、ニーズに合ったものを選択する必要があります。これがWindowに最適なC/C++IDEのリストです。 Visual Studio − Microsoftが開発したIDEです。このIDEは、Windows上でC ++のプログラムを構築、開発、およびプロファイリングするためのクラス最高のツールを備えています。 Visual Studioには、多数のプラグインを備えた巨大なプラグインストアもありま

  2. C ++変数はconstとvolatileの両方にすることができますか?

    はい、C++変数はconstとvolatileの両方である必要があります。これは、読み取り専用のハードウェアレジスタ、または別のスレッドの出力などの状況で使用されます。 Volatileは、現在のスレッドの外部の何かによって変更される可能性があることを意味し、Constは、(const宣言を使用しているプログラムで)書き込みを行わないことを意味します。