在函数中操作尚未标注的数组

时间:2012-10-23 08:10:09

标签: c++ arrays pointers

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

我的代码看起来像这样

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;
}

我的问题是,当我尝试从main函数访问TheArray时,我收到“Segmentation fault(core dumped)”消息。显然,在调用ReadData函数后,我没有使用“TheArray”指针指向正确的位置。如果我在ReadData函数中将数据打印到屏幕上,AnArray和TheArray都指向相同的(和正确的)。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

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

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

    *TheArray = AnArray;
}

并称之为

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

修改:使用Pete评论中的建议可能会更好。但是,更好的方法是停止使用原始指针,并开始使用std::vector

答案 1 :(得分:0)

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

使用指针指针,这将是:

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

任务将是:

*TheArray = AnArray;

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

会更好(恕我直言)