从函数返回变量地址时如何修复"与局部变量关联的堆栈内存地址"?

How to fix 'address of stack memory associated with local variable' when returning a variable address from function?

本文关键字:地址 局部变量 关联 堆栈 内存 何修复 返回 函数 变量      更新时间:2023-10-16

我的教授让我复制并粘贴她写的代码下面,它一直给我错误。

通过运行她的程序,任何值的输出都是 1。

从逻辑上讲,我了解该函数应该如何返回地址,并且主要打印它的值。从理论上讲,就是这样。

所以这是我到目前为止尝试过的:

  1. 只需删除语句 p = cube(&n) 并替换为:

    std::cout << "Cube of " << n << " is " << cube(&n) << std::endl;
    

    这奏效了。

  2. 为了解决"局部变量"错误,我使"result"成为全局变量。

  3. 在cube()中,我做到了:

    int *cube(int *number)
    {
    int result = (*number) * (*number) * (*number);
    int *newResult = &newResult;
    return newResult;
    }
    

    。但它为任何整数输出 1。

这是她分享的代码示例。

#include <iostream>
int *cube(int *);
int main()
{
int n, *p;
std::cout << "Enter an int: ";
std::cin >> n;
p = cube(&n);
std::cout << "Cube of " << n << " is " << *p << std::endl;
return 0;
}
int *cube(int *number)
{
int result = (*number) * (*number) * (*number);
return &result;
}

据她介绍,该程序的输出应该是输入整数的立方体。例如,3 进 -> 27 出。

您正在尝试返回无法在其声明范围之外访问的本地引用。您需要使用new关键字而不是堆栈在堆上分配内存。在此处查看差异。

int* cube(int number)
{
return new int (number * number * number);
}

请注意,我按值而不是按引用传递number,因为没有明显的速度性能/需要修改传入变量的值。我也不费心制作中间变量,newResult,因为new的结果可以返回。请记住,如果我要创建一个中间值newResult,它将是int*类型。当您不再需要结果时,不要忘记归还内存。使用delete关键字释放内存。 话虽如此,不要费心返回指针,因为堆的使用很慢,手动内存分配很混乱。

以下是您应该使用的。

int cube(int number)
{
return number * number * number;
}

创建静态变量和全局变量时应谨慎使用,因为它们会使用更多内存。

通过引用传递基元变量也是不可取的,请阅读不通过引用传递简单类型的原因?。

void cube3(int &number)
{
number = (number) * (number) * (number);
}

它是关于变量的范围。

1.全局变量。

"结果"是一个局部变量,不能在 { 和 } 块之外访问或使用。您可以通过全局变量使用它。

全局变量声明在程序顶部的所有函数或块之外。

static int result;
void cube(int *number)
{
result = (*number) * (*number) * (*number);
}

在 C 中,可以通过指针将参数传递给函数。

void cube2(int *number)
{
*number = (*number) * (*number) * (*number);
}

2.通过引用。

在C++中,您可以通过指针(cube2)或引用代码吹气将参数传递给函数:

void cube3(int &number)
{
number = (number) * (number) * (number);
}

在主函数中:

int main()
{
int input_num, n;
std::cout << "Enter an int: ";
std::cin >> n;
input_num = n;
cube(&n);
std::cout << "Cube of " << input_num << " is " << result << std::endl;
cube2(&n);
std::cout << "Cube of " << input_num << " is " << n << std::endl;
n = input_num;
cube3(n);
std::cout << "Cube of " << input_num << " is " << n << std::endl;
return 0;
}

result是一个局部变量,并在堆栈上分配。当该函数结束时,结果拥有的内存不再有效。因此,指向该内存的任何指针都是无效的。

对于如此简单的函数,无需为指针而烦恼。只需按值返回结果的副本。

int cube(int *number)
{
int result = (*number) * (*number) * (*number);
return result;
}