在我的程序中使用指向数组的双指针时,我有一个奇怪的行为,如下所示:
/* 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(...) ,我可能遗漏了什么!愿有人找到一些东西!