int**
で宣言された2次元整数配列を初期化して変更する正しい構文はC++でですか?C++の関数内の2次元配列の値を変更
私は以下のコードを使用していますが、関数の終了時にメモリが割り当て解除されるため予期しない動作が発生します。
しかし、これはC++でどのようにうまくいくのでしょうか?私は他の人が同様の問題に直面していることを知っていますが、Is passing pointer argument, pass by value in C++?のような質問はあまりにも一般的です。
void Insert_into_2D_Array(int** foo, int x_pos, int y_pos, int x_size, int y_size)
{
int insert_value = 10;
if (x_pos < x_size && y_pos < y_size) {
foo[x_pos][y_pos] = insert_value; // insert_value lost post func exit?
}
}
void Init_2D_Array(int** foo, int x_size, int y_size)
{
foo = new int*[x_size]; // new alloc mem lost post func exit ?
for (int i=0;i<x_size;i++)
{
foo[i] = new int[y_size]; // new alloc mem lost post func exit
}
}
int main(int agc, char** argv)
{
int** foo;
int x_size=10, y_size=10;
Init_2D_Array(foo, x_size, y_size);
Insert_into_2D_Array(foo, 3,3, x_size, y_size);
}
「new」を呼び出すと、関数が返ってもメモリは割り当て解除されません。 – user463035818
割り当てが解除されていません。単にポインタ 'foo'の値を設定するだけです。これは渡される*値*です。ローカルで 'foo'を宣言するか、' int *** foo'を渡して最後に参照解除する必要があります。 – meowgoesthedog
Doing 'Init_2D_Array(foo)'はあなたが言っているようにそれを値渡しします。参照渡しするには、構文はどうすればよいですか? –