2017-10-30 4 views
0

通常、関数内の配列のスコープで終わります。しかし、もし私が事前に割り当てると、それは完全に配列を返します。では、配列の割り当てと配列の宣言の違いは何ですか? 私はコードと私が混乱している場所を書いています。最初の宣言などの動的なメモリ割り当てが原因ですか?誰かが丁寧に説明できますか?特定のサイズの配列の割り当てとcppの特定のサイズの配列の宣言との違いは何ですか?

#include <bits/stdc++.h> 
#define N 10 

using namespace std; 

int * get_array() { 
    int * p = new int[N]; 
    //|--- by declaring like this, the array was perfectly returned. 

    int p[N]; 
    //|--- but is case of this declaration the array returned showed garbage value in the main function. 
    for(int i = 0; i < N; ++i) p[i] = i; 
    return p; 
} 

int main(int argc, char const *argv[]) 
{ 
    int * M = get_array(); 
    for (int i = 0; i < N; ++i) { 
     cout << M[i] << endl; 
    } 
    return 0; 
} 
+0

スタックにポインタを戻していますランタイムクラッシュポインタ/ローカル変数への参照(スタック上) –

+0

また、これらのエラーを捕捉するのに役立つように '-Wall -Werror'でコンパイルすることを検討してください。 – Ahmad

+0

@Shaikh Islam 2番目のケースでは、返されたポインタは、存在しないオブジェクトを指しているため無効です。最初のケースで –

答えて

0

2番目のケースでは、配列は関数のヒープ内に作成されるため、関数を終了するとその配列はもう存在しません。 最初のケースでは、配列を格納するメモリ領域を確保しているため、関数それ自体はではなく、その破壊を処理する必要があります。

+0

、それはヒープまたはスタックですか? –

+0

@ShaikhIslamもし私が正しく覚えていれば、**ポインタ**はスタックにありますが、あなたが予約した実際の配列は単に汎用メモリ*の外側にありますが、それを予約したプログラムに属しています。 – alseether

関連する問題