在功能中操纵未达到的阵列

manipulating not-yet-dimensioned arrays in function

本文关键字:阵列 未达到 操纵 功能      更新时间:2023-10-16

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

我的代码看起来像

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都指向相同的(以及正确的事物)。正确的方法是什么?

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

void Readata(char* fname, int* n, int** TheArray){
    ...
    *TheArray = AnArray;
}

并将其称为

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

编辑:使用皮特评论中的建议可能更好。但是,最好是完全停止使用原始指针,然后开始使用std::vector

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

用指针指向指针,这将是:

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

分配是:

*TheArray = AnArray;

但是,当您将问题标记为c 时,通过参考传递std :: vector并调整大小 将其填充readata()

是更好的(IMHO)。