0

我正在尝试执行以下操作:使用函数读取包含整数数据的文本文件,这样代码不会弄乱我的主函数,然后将数据解析到主函数。

我的代码看起来像这样

void Readata(char* fname, int* n, int* TheArray){
  int nn=0;
  int anyInt=0;

  ifstream InFile( fname );
  if ( ! InFile.is_open() ) throw myErrHandler("Could not open input file");

  InFile >> anyInt;
  if ( ! InFile ) throw myErrHandler( "Could not read size of array" );
  nn=anyInt;
  (*n)=nn;    

  int* AnArray = (int*) calloc(nn,sizeof(int));
  for(int i=0; i<nn; i++){
    InFile >> anyInt;
    if ( !InFile ) throw myErrHandler( "Could not read data" );
    AnArray[i]=anyInt;
  }
  TheArray = AnArray;
}

主要功能看起来像

int main(int argc, char **argv){
  if ( argc < 2 ){
    cerr << "Usage: " << argv[0] << " input file" << endl;
    return 777;
  }

  int n;
  int* TheArray;
  ReadData(arg[1], &n, TheArray);
  return 1;
}

我的问题是,当我尝试从主函数访问 TheArray 时,我收到“分段错误(核心转储)”消息。显然,在调用 ReadData 函数后,我没有用“TheArray”指针指向正确的位置。如果我在 ReadData 函数中将数据打印到屏幕上,AnArray 和 TheArray 都指向相同的(并且是正确的)。这样做的正确方法是什么?

4

2 回答 2

1

当您调用指针时ReadDataTheArray指针是按值传递的,因此在函数内部它的行为就像任何其他非指针参数一样,这意味着对它的更改将在函数外部不可见。您必须将实际指针作为参考(即指针的地址)传递给参数以更改它:

void Readata(char* fname, int* n, int** TheArray){
    ...

    *TheArray = AnArray;
}

并称它为

Readdata(arg[1], &n, &TheArray);

编辑:使用Pete评论中的建议可能会更好。但是,更好的是完全停止使用原始指针,并开始使用std::vector.

于 2012-10-23T08:14:56.660 回答
0

这是因为您将指针按值传递给 TheArray,因此您的分配是在指针的副本上。正确的方法是通过引用传递指针或将指针传递给指针。

使用指向指针的指针将是:

void Readata(char* fname, int* n, int** TheArray){

任务是:

*TheArray = AnArray;

但是,当您将问题标记为 c++ 时,最好(恕我直言)通过引用传递 std::vector 并将其调整大小 + 填充到 Readata()

于 2012-10-23T08:20:23.197 回答