gpt4 book ai didi

c++ - 在函数中操作尚未维数的数组

转载 作者:行者123 更新时间:2023-11-28 07:54:30 25 4
gpt4 key购买 nike

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

我的代码是这样的

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 指针是按值传递的,因此在函数内部它的行为与任何其他非指针参数一样,这意味着不会对其进行更改在函数外可见。您必须将实际指针作为引用(即指针的地址)传递给参数才能更改它:

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

*TheArray = AnArray;
}

并称它为

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

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

关于c++ - 在函数中操作尚未维数的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13026036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com