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

  • 平台:win 7 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

/* 对不起。但较早的答案是不正确的。循环正确地从零开始并在 < 限制处结束。问题是您声明了一个指针数组,但从未将内存分配给它们指向的对象。您的输出显示的是地址而不是数字。一种方法是在使用对象时分配对象(也必须单独删除它们)*/

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

您真正想要使用的是标准库中的向量类,它为您处理所有这些:

#include <vector>

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

祝你好运 ...

于 2012-09-16T09:38:50.313 回答