我正在尝试执行以下操作: 使用函数读取包含整数数据的文本文件,以便代码不会弄乱我的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都指向相同的(和正确的)。这样做的正确方法是什么?
答案 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()
会更好(恕我直言)