gpt4 book ai didi

将方法返回值分配给 int 时 C++ 程序崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 16:07:44 25 4
gpt4 key购买 nike

这个问题现在让我很头疼。

int main()
{
char inputChar;
char *buffer = nullptr;
int size = 0;

read(buffer); //this is the line causing problems...

int numberOfFrames = (size / MAX_FRAME_SIZE) + 1;
frame array[numberOfFrames];

for(int i = 0; i < size; i++)
{
buffer[i] = appendParityBit(buffer[i]);
}

constructFrame(buffer, size, array);
transmitFrames(array, numberOfFrames);
}

int read(char *buffer)
{
int fileSize;
ifstream myfile ("inputFile");
if (myfile.is_open())
{
fileSize = getFileLength(myfile);
buffer = new char[fileSize];

myfile.read(buffer, fileSize);
myfile.close();
}
return fileSize;
}

int getFileLength(ifstream &myfile)
{
myfile.seekg(0, ios::end);
int size = (int) myfile.tellg() - 1;
myfile.seekg(0, ios::beg);
return size;
}

现在如果我做一个

cout << read(buffer); 

在导致问题的行上,我收到了一个整数返回...太棒了,完美。但如果我尝试做

size = read(buffer);  

我的程序崩溃了……我很茫然。

最佳答案

您正在按值传递变量(无论它是否为指针都无所谓)。在接收端,该函数对传递的内容进行本地复制,使用本地拷贝,噗,当函数返回时,本地拷贝消失了。

无论您传递的是不是指针,都会发生这种情况。例如,使用这个简单的代码:

void foo(int x)
{
x = 10;
}

int main()
{
int val = 0;
foo(val);
cout << val; // how come val is still 0 and not 10?
}

请注意 val 仍然为 0,即使该函数正在更改传递的参数。要解决此问题,您将引用传递给将要更改的值:

void foo(int& x)
{
x = 10;
}

int main()
{
int val = 0;
foo(val);
cout << val; // now val is 10
}

有了指针,规则就不会改变。您需要传递对指针的引用以使更改反射(reflect)回调用者:

int read(char*& buffer)
{
int fileSize;
ifstream myfile ("inputFile");
if (myfile.is_open())
{
fileSize = getFileLength(myfile);
buffer = new char[fileSize];

myfile.read(buffer, fileSize);
myfile.close();
}
return fileSize;
}

现在该函数中的 buffer 不是本地拷贝,而是对您传递的变量的引用。

另一种方法(更像“C”风格)是传递一个指向你想要改变的东西的指针。你想改变指针的值,所以你传递一个指针给指针:

int read(char** buffer)
{
int fileSize;
ifstream myfile ("inputFile");
if (myfile.is_open())
{
fileSize = getFileLength(myfile);
*buffer = new char[fileSize];

myfile.read(buffer, fileSize);
myfile.close();
}
return fileSize;
}

// the caller
char *buffer;
//...
read(&buffer);

当然,我们必须更改语法,因为它是一个正在传递的指针,因此我们需要取消引用它。

关于将方法返回值分配给 int 时 C++ 程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32705042/

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