0
int** function()
{
    int M[2][2] = {{1,2},{3,4}};
    return (int **)M;   //is this valid?
}

void anotherFn()
{
    int **p = new int*[2];
    for(int i = 0; i<2; i++) {
        p[i] = new int[2];
    }

    p = function();  
    cout << p[0][0]; 
}

上記のコードはコンパイルされましたが、実行時エラーが発生しました。では、2D 配列が double ポインターとして宣言されている場合にのみ 2D 配列を返すことはできますか、それとも配列を 2D ポインターとして返す方法はありますか?

4

2 に答える 2

3

2D 配列を int へのポインターへのポインターとして表しています。それは悪い考えです。より良いアイデアは、を使用することstd::vector<std::vector<int>>です。さらに良いのは、専用のクラスを使用することです。しかしポイントは、ポインタを取り除くと問題なく値を返すことができるということです:

matrix_2d function() {
    matrix_2d M = {{1, 2}, {3, 4}};
    return M;
}

これは (上記参照) の適切な定義に対して非常にうまく機能しますmatrix_2d

あなたのコードは、ポインタを使用してこのプロセス全体をより複雑にし、無効なメモリにアクセスします。特に、メイン関数でメモリを割り当てていますが、そのメモリへのポインタを次の結果で再割り当てすることにより破棄しています:内部では、以前に割り当てられたメモリを使用していません。スタックに割り当てられたメモリを使用しており、それへのポインタを返します。関数が終了すると、スタックに割り当てられたメモリはなくなります。function()function

于 2012-12-17T15:52:28.573 に答える
2

2D 配列を返すには、必ず動的に割り当ててからポインターを返します。コードの問題は、ローカル変数へのポインターを返すことであり、これが問題を引き起こします。

基本的に、次のようなことをしたいと思うでしょう (スケルトン):

int** function()
{
    int** M;
    // Allocate M here
    return M;
}
于 2012-12-17T15:49:58.057 に答える