0

私のプログラムはいつもばかげたエラーを生成するようです。道順を教えてください。次のコード セグメントは、すべての無関係な部分を切り取っています。ありがとう。

コード セグメントのパート A は、配列を正しく初期化できなかったようです。デバッグ方法は? コード セグメントのパート B は常にクラッシュします。見逃しているものはありますか?


typedef unsigned long T_PSIZE;
int main()
{
   int AG_TOTAL = 6 ;
   /* part A1 */
   T_PSIZE* cntPeopleByAge = new T_PSIZE[AG_TOTAL + 1];
   /* part A2 - originally i use static array like this, but it also fails */
   //T_PSIZE cntPeopleByAge T_PSIZE[AG_TOTAL + 1];
   for (int i = 0; i < (AG_TOTAL + 1); i++)
   {
     std::cout << i << ":" << cntPeopleByAge[i] << "\t";
     cntPeopleByAge[i] = 0;
     std::cout << cntPeopleByAge[i] << "\n";
   }
   std::cout << "cntPeopleByAge:" << cntPeopleByAge[ AG_TOTAL + 1 ] << "\n";
   /* part B */
   delete [] cntPeopleByAge;
   return 0; // <---  crash here!
}

サンプル出力

0:200320        0
1:201581        0
2:201582        0
3:201583        0
4:0     0
5:0     0
cntPeopleByAge:1799119387:0:0

  • プラットフォーム: win7 x64
  • コンパイラ: TDM-GCC x64
4

2 に答える 2

5
for (int i = 0; i < (AG_TOTAL + 1); i++)
   {
     std::cout << i << ":" << cntPeopleByAge[i] << "\t";
     //                       ^^^^^^^^^^^^^^^^
     // You're reading uninitialized memory here

     cntPeopleByAge[i] = 0;
     std::cout << cntPeopleByAge[i] << "\n";
   }

そしてここ

std::cout << "cntPeopleByAge:" << cntPeopleByAge[ AG_TOTAL + 1 ] << "\n";

あなたは限界を超えています。最後の有効なインデックスは ですAG_TOTAL

未定義の動作 (UB) があります。エラーは、UB ができる限りばかげています。

于 2012-09-16T07:55:44.557 に答える
-1

/* ごめん。しかし、その以前の答えは正しくありません。ループは正しくゼロから開始し、< 制限で終了します。問題は、ポインターの配列を宣言しているが、ポインターが指すオブジェクトにメモリを割り当てていないことです。出力には、数字ではなく住所が表示されています。1 つの方法は、使用するオブジェクトを割り当てることです (オブジェクトも個別に削除する必要があります) */

T_PSIZE* cntPeopleByAge = new T_PSIZE[AG_TOTAL + 1];    
for (int i = 0; i < (AG_TOTAL + 1); i++)    
{ 
cntPeopleByAge[i] = new T_PSIZE();
}

本当に使いたいのは、これらすべてを処理する標準ライブラリの vector クラスです。

#include <vector>

std:vector<T_PSIZE *> cntPeopleByAge;
cntPeopleByAgex.resize(AG_TOTAL + 1);

幸運を ...

于 2012-09-16T09:38:50.313 に答える