-1

コードは次のようになります。

void fUnc(float b){
  //does nothing  
}

float* fInit(void){
  float result[3];
  result[0] = 1.0;
  result[1] = 1.0;
  result[2] = 1.0;

  return result;
}

int main(){
  float* a = new float[3];
  a = fInit();
  fUnc(a[0]);
  printf("%f, %f, %f", a[0], a[1], a[2]);

  return 0;
}

配列要素の値は -107374176.000000 です。fUnc(a[0]) [何もしない] がコメントアウトされている場合、すべてがうまく機能します。どうしたの?

編集:コードは、理解を深めるために少し編集されています

4

1 に答える 1

1

そのような生の配列を返すことはできません。あなたfInit()がすることは、関数が戻ると無効になるローカルメモリのアドレスを返すことです。

あなたのathen は、ある意味であなたの 内のメモリを指していますfInit()が、これはもはや有効ではありません。要素を読み取ろうとするとa[n]、未定義の動作が発生します。

std::vectorたとえば、配列のサイズが実行時に決定されるstd::array場合、またはコンパイル時にサイズがわかっている場合は、標準コンテナの 1 つを使用する必要があります。連鎖リストが必要な場合は、などを使用std::listします。

すべての標準コンテナーはコピー可能です (つまり、返却可能です)。

http://en.cppreference.com/w/cpp/containerを参照してください。

そして、必ず http://en.cppreference.com/w/をブックマークしてください。また、自分でアルゴリズムを書きたくなったり、自分で を呼び出したりしたくなるたびnewに、参考文献を調べてください。そして良い本を手に入れよう

于 2013-08-10T09:31:38.830 に答える