1

在我的程序中使用指向数组的双指针时,我有一个奇怪的行为,如下所示:

 /* in a.h  
  */
 class A{
   private:
     int _n;
     int _m;
     int _p;
     int _dim;
     int** _t1;
     int** _t2;

   public:
     ~A();
     A();
     A(const A& a);
     A& operator=(const A& a);
     A(int n, int m, std::string filename);
 };

 int readfile(int* p, int* dim, int*** t1, std::string filename);

 /* in a.cpp  
 */
 A::A(int n, int m, std::string filename){
   _n = n;
   _m = m;
   _t1 = NULL;
   _t2 = NULL;

   int ierr;
   ierr = readfile(&_p, &_dim, &_t1, filename);
   // print _t1[i][j] here : no problem

   // fill _t2 from _t1 : PROBLEM!!
   _t2 = new int*[_p];
    // check allocation
    for(int k = 0; k < _p; k++){
       _t2[k] = new int[_dim];
    }

    for(int k = 0; k < _p; k++){
        for(int j = 0; j < _dim; j++){
          _t2[k][j] = 0;
        }
     }

     int In, ie, nv;

     for(int k = 0; k < _p; k++){
          nv = _t1[k][_dim];
          if(nv == dim){
             for(int in = 0; in < nv; in++){
                 In = _t1[k][in];
                 ie = _t2[In][_dim];
                 _t2[In][ie] = k;
                 _t2[In][_dim] += 1;
             }
          }
       }

 }

 int readfile(int* p, int* dim, int*** t1, std::string filename){

   std::ifstream fid;  
   std::string line;
   std::stringstream pline;

   fid.open(filename.c_str(), std::ifstream::in);
   if( !fid.is_open() ){
        fprintf(stderr, "Error : Can't open %s ...\n", filename.c_str() );
        exit( -1 );
    }

    getline(fid, line);
    pline.str(line);
    pline >> (*p);

    getline(fid, line);
    pline.str(line);
    pline >> (*dim);

    *t1 = new int*[(*p)];
    // check allocation
    for(int k = 0; k < *p; k++){
       (*t1)[k] = new int[(*dim)];
    }

    int j;
    for(int k = 0; k < *p; k++){
       getline(fid, line);
       pline.str(line);
       j = 0;
       while( pline >> (*t1)[k][j] ){ j += 1};
    }
    fid.close();

    return ( 0 );
 }

事实是:双指针“_t1”正在从函数“readfile(...)”中分配和填充。这没关系,因为简单的“打印”表明已从文件中正确读取了值。现在,数组 '_t2' 被分配在类 A 构造函数中;当我开始从 _t1 填充 _t2 时,数组 _t1 中的值似乎发生了变化,我不知道为什么!调用函数 readfile(...) 后,没有对数组 _t1 执行任何其他操作,但是当我在分配 _t2 期间打印它的值时,它们与第一次打印不再相同。我一直认为数组 _t1 已通过引用正确传递给函数 readfile(...) ,我可能遗漏了什么!愿有人找到一些东西!

4

0 回答 0