2016-11-30 6 views
-1

私はツリークラスとグローバル関数を作成しました。私はTreeクラスの関数 'insert'は、グローバル関数から '返された'別の配列を使って初期化された配列を作成しました。グローバル関数から返された配列は、その関数内でうまく動作しますが、 'insert'関数の中で配列(必須配列)に代入されると、ガベージ値が与えられます。配列返り値

は、ここでは、割り当てを解除されますスタック上に割り当てられた(未定義の動作の原因となる)、一時、ローカル変数、にpointerを戻ってきている

float *func_calc(...,...,...,...) 
{ 
    float decisions[17] = { 0 }; 
    .... 
    ....... 
    ......... // Put Values into the 'decisions' array 
    return decisions; 
} 

class Tree 
{ 
    .. 
    .... 
    ..... 

    insert(...,...,...,...) 
    { 
    .... 
    float* fun_array = new float[17]; 
    float min_num = 0; 
    for (int i = 1; i <= 6; i++) 
    { 
     if (i == 1) 
     { 
      fun_array = func_calc(...,...,...,...); // same arguments as the insert function arguments 
      min_num = fun_array[0]; 
     } 
     else 
     { 
      fun_array = entropy(i, array, arraysize, rD); 
      float num = entfun_array[0]; 
      if (num < min_ent) 
      { 
       min_num = num ; 
      } 
     } 
    } 
} 
}; 

int main() 
{ 
    Tree T1; 
    T1.insert(... , ... , ..., ...); 
} 
+6

ローカル変数へのポインタを返します。これはUBです。 – Borgleader

+0

コードを書式設定するのに少し努力できますか? – CharlesB

+0

浮動小数点のベクトルを使って、 – pm100

答えて

1

(による盗作の問題への完全ではありません)コード です関数が返るとき。最初にarrayを作成して上記の関数に渡すと良いでしょう。

あるいは、、好ましくない危険、この方法は、非ローカルメモリを確保するために、関数内decisions配列にヒープ上にメモリを割り当てることができます:

float *decisions = malloc(17*sizeof(float)); 

しかし、その後、あなたがする必要があります割り当て解除メモリ(free())をmalloc()を使用して割り当てます。そうしないとメモリリークが発生します。

+1

この回答は、盗作問題のためにドットで置き換える必要があります。 – Slava

+0

^あなた自身に意味のあるコメントを残すか、ただ私に答えてください。 – SunAns

+0

更新された答えをご覧ください。 @SunAns – Jarvis

関連する問題