C++ 如何修复';与局部变量';从函数返回变量地址时?

C++ 如何修复';与局部变量';从函数返回变量地址时?,c++,pointers,C++,Pointers,我的教授让我复制并粘贴她写的下面的代码,它不断给我带来bug 通过运行她的程序,任何值的输出都是1 从逻辑上讲,我理解函数应该如何返回地址,并且它主要打印地址的值。理论上是这样 以下是我到目前为止所做的尝试: 1) 只需删除语句p=cube(&n)并替换为: std::cout << "Cube of " << n << " is " << cube(&n) << std::endl; …但它对任何整数都输出1 这是她

我的教授让我复制并粘贴她写的下面的代码,它不断给我带来bug

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

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

以下是我到目前为止所做的尝试:

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

    std::cout << "Cube of " << n << " is " << cube(&n) << std::endl;
…但它对任何整数都输出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;
}
#包括
整数*立方体(整数*);
int main()
{
int n,*p;
std::cout>n;
p=立方体(&n);

std::cout您试图返回一个不能在声明范围之外访问的。您需要使用
new
关键字而不是堆栈在堆上分配内存。请检查差异

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

下面是你应该使用的

int cube(int number)
{
    return number * number * number;
}
创建静态和全局变量时应小心使用,因为它们将使用更多内存

通过引用传递基元变量也是不可取的


您正试图返回一个不能在声明范围之外访问的。您需要使用
new
关键字而不是堆栈在堆上分配内存。请检查差异

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

下面是你应该使用的

int cube(int number)
{
    return number * number * number;
}
创建静态和全局变量时应小心使用,因为它们将使用更多内存

通过引用传递基元变量也是不可取的


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

对于这样简单的函数,不需要使用指针,只需按值返回结果的副本即可

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

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

对于这样简单的函数,不需要使用指针,只需按值返回结果的副本即可

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

这是关于变量的范围

1.全局变量。

“result”是一个局部变量,无法在{and}块外部访问或使用。您可以通过全局变量使用它

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

static int result;
void cube(int *number)
{
    result = (*number) * (*number) * (*number);
}
在C语言中,可以通过指针将参数传递给函数

void cube2(int *number)
{
    *number = (*number) * (*number) * (*number);
}
2.通过引用传递。

在C++中,可以通过指针(CuBE2)或引用代码BUL:

将参数传递给函数。
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;
}
intmain()
{
int input_num,n;
std::cout>n;
输入_num=n;
多维数据集(&n);

std::cout它是关于变量范围的

1.全局变量。

“result”是一个局部变量,无法在{and}块外部访问或使用。您可以通过全局变量使用它

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

static int result;
void cube(int *number)
{
    result = (*number) * (*number) * (*number);
}
在C语言中,可以通过指针将参数传递给函数

void cube2(int *number)
{
    *number = (*number) * (*number) * (*number);
}
2.通过引用传递。

在C++中,可以通过指针(CuBE2)或引用代码BUL:

将参数传递给函数。
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;
}
intmain()
{
int input_num,n;
std::cout>n;
输入_num=n;
多维数据集(&n);

std::cout没有理由在这里使用指针。如果您确实想返回指针,可以使用现有变量的地址或创建
新int
,设置其值,使用它,然后
删除它。她的代码返回指向堆栈中从函数返回后变得未定义的部分的指针。比如@dyukha说如果您希望从此函数返回指针,它应该指向堆上的某个对象(使用new()创建)不是堆栈。这里没有理由使用指针。如果您确实想返回指针,请使用现有变量的地址或创建
新int
,设置其值,使用它,然后
删除它。她的代码返回一个指针,指向从函数返回后未定义的堆栈部分。例如@dyukha says如果要从该函数返回指针,它应该指向堆(使用new()创建)上的某个对象,而不是堆栈。