我正在尝试编写一个简短的函数,它可以让我快速读入一个未知大小的文件,并返回指向数组数组和该数组长度的指针,但似乎我的代码无效。我做错了什么?
int readIn(int* pointer, param parameters, string description)
{
string fileName = parameters.fileName + " " + description + ".bin";
ifstream readFile;
readFile.open(fileName.c_str(), ios::in|ios::binary|ios::ate);
int size = readFile.tellg();
int length = size / 4;
int* output = new int [length];
readFile.seekg (0, ios::beg);
readFile.read(reinterpret_cast<char*>(output), (size));
readFile.close();
pointer = output; // link new array with the pointer
return length;
}
并在主要功能中:
int* testList;
int numEntries = readIn(testList, parameters, "test");
我最终得到一个错误,说我的testList变量已被使用且未初始化。我做错了什么?
答案 0 :(得分:2)
在函数调用之后,您没有在指针变量中返回任何内容。
您可以通过取消引用它的地址来填充变量,使其值在函数调用后保持更改。
示例:
void fillX(int *p)
{
//p holds a memory address, go to that memory address and change its value
*p = 4;
}
void main(int argc, char **argv)
{
int x;
fillX(&x);
return 0;
assert(x == 4);
}
要更改指针指向的内容,您需要传入指向指针的指针。
即。你需要传入指针的地址,然后你需要参数类型为int** pointer
。设置后,您会说*pointer = buffer;
示例:强>
void fillPointer(int **pp)
{
//p holds a memory address to a pointer
//Go to that memory address and change its value
*pp = new int[10];
}
void main(int argc, char **argv)
{
int *x;
fillPointer(&x);
//x now points to the first element of an array
delete[] x;
return 0;
}
关键点:当您想通过参数更改值时,您需要传入它的地址,然后取消引用它以设置该地址的内容。
答案 1 :(得分:1)
int readIn(int** pointer, param parameters, string description)
...
*pointer = output
...
int numEntries = readIn(&testList, ...)
答案 2 :(得分:0)
我可能在这里错了,但也许你需要完成你的功能,
int readIn(int **pointer, param parameters, string description)
,即指向指针的指针。用它打电话,
int numEntries = readIn(&testList, parameters, "test");
vars在C / C ++中按值传递。