从函数返回变量地址时如何修复"与局部变量关联的堆栈内存地址"?
How to fix 'address of stack memory associated with local variable' when returning a variable address from function?
我的教授让我复制并粘贴她写的代码下面,它一直给我错误。
通过运行她的程序,任何值的输出都是 1。
从逻辑上讲,我了解该函数应该如何返回地址,并且主要打印它的值。从理论上讲,就是这样。
所以这是我到目前为止尝试过的:
-
只需删除语句 p = cube(&n) 并替换为:
std::cout << "Cube of " << n << " is " << cube(&n) << std::endl;
这奏效了。
-
为了解决"局部变量"错误,我使"result"成为全局变量。
-
在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;
}
- libmysql:警告:返回局部变量"行"的地址(C++/C)
- 从函数返回变量地址时如何修复"与局部变量关联的堆栈内存地址"?
- 变量循环范围会导致返回局部变量的地址引用
- 局部变量保存相同的内存地址
- 使用函数模板中静态局部变量的地址作为类型标识符是否安全
- 警告:返回局部变量'buffer'地址
- 返回的与局部变量关联的堆栈内存的地址 (C++)
- 局部变量的地址
- 警告:返回局部变量"角度"的地址 [-Wreturn-local-addr]
- 是否释放了局部变量的地址
- 局部变量和其他变量类型的地址存储在哪里
- 局部变量的内存地址根据 lambda 参数的预感而变化
- 我想返回局部变量的地址
- 为什么局部变量的地址每次都不同
- 将局部变量的地址作为C++11中的常量表达式
- 为什么编译器在编译时不知道局部变量的地址?
- 更改局部变量的地址
- 局部变量的返回地址和程序仍然有效
- 为什么局部变量的地址对于不同的执行是相同的
- 将地址返回给局部变量与返回指向局部变量的指针