在功能中操纵未达到的阵列
manipulating not-yet-dimensioned arrays in function
我正在尝试执行以下操作:读取包含整数数据的文本文件,以使代码不会弄乱我的主函数,然后将数据解析为主函数。
我的代码看起来像
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()
相关文章:
- 随机数未达到限制
- 未达到的情况会影响开关外壳性能
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 当我的阵列达到一定大小时,Qt 不起作用
- 模板元编程三元值未达到基本情况
- 未分配阵列上的编号
- 摆动,传递未指定维度的阵列
- 来自未签名的短阵列的OpenCV垫子
- MD 阵列未更新
- 两个未分类阵列之间的最小差异
- 连接循环准确的Systemc编码样式,具有未达到的编码样式
- 我如何格式化十六进制中“未签名char”阵列的值
- 静态函数阵列上未解决的外部符号
- 字符阵列未正确初始化
- 为什么未达到的 try-catch 块会增加运行时时间
- 如何在我的指针和阵列功能中修复未解决的外部错误-LNK2019和LNK1120
- 在功能中操纵未达到的阵列
- 阵列未通过 cout 打印出来
- Parralrel工作但未达到预期效果
- 长双精度未达到要求