3

重複の可能性:
ローカル変数のメモリにそのスコープ外でアクセスできますか?

したがって、単純な c++ 関数を次に示します。何をするか 引数として文字の配列と整数 n を取り、配列の n 要素だけで新しい文字配列を作成します。

char * cutString(char * ch , int n){

  char * p = new char[n];
  int i ;
  for(i = 0 ; i < n ; i++)
         p[i] = ch[i];
  while(i <= n ){
    p[i++] = '\0';
  }
  return p ;

}

これは問題なく動作しますが、変更char * p = new char[n];するchar p[n];と面白い文字が表示されます。何が起こるのですか?前者はどのような違いがありますか?また、p は一時変数です。関数はどのようにそれを正常に返しますか?

4

4 に答える 4

9

char *p = new char[n]ヒープにメモリを動的に割り当てます。このようなメモリの有効期間は、どの関数にもバインドされておらず、( を使用して) 割り当てが解除されるまで存在しますdelete[]。したがって、それへのポインターを返すことは完全に有効です。

char p[n]一方、 はstackにメモリを割り当て、その有効期間はそれを定義する関数にバインドされます。その関数が戻ると、メモリへの参照はすべて無効になります。

于 2012-11-09T16:09:47.127 に答える
7

コードを次のように変更すると:

char p[n];

...そして return p、ローカルスコープの変数へのポインターを返しています。関数が戻った後、p存在しなくなります。要するに、未定義の動作を引き起こしているということであり、これを行うとプログラムの形式が正しくありません。

于 2012-11-09T16:09:33.057 に答える
1

new char[n]ヒープ上のメモリを消費するためです(後でalloc忘れないでください)delete[]

一方char p[n];、関数が戻った後に自動的に再利用されるスタックに常駐する静的配列です

関数からそれへの参照を返す場合、 unues メモリへのポインタを返し、未使用のメモリを参照することはストック標準の未定義の動作です

于 2012-11-09T16:10:26.437 に答える
1

これは、メモリの動的割り当てと自動割り当ての違いです。char * p = new char[n];動的割り当てであり、削除するまでメモリが有効であることを意味します。一方、char p[n];厳密に言えば合法的な C++ ではありませんが、使用しているコンパイラでは自動割り当ての形式であるため、関数を終了するとメモリが無効になります。面白いキャラクターが見えるのはそのためです。

于 2012-11-09T16:10:43.650 に答える