C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
What exactly is C++'s behavior regarding pointers and using functions to initlize them to the heap?
目前在弄清楚为什么这个函数不会通过函数完全初始化主指针时遇到了一些麻烦。这是我正在尝试做的一个例子。
#include <iostream>
void stuff(int * p)
{
p = new int;
}
int main()
{
int * p;
stuff(p);
*p = 1;
std::cout << *p << std::endl;
return 0;
}
基本上,我正在尝试使函数使整数指针访问堆。之后,我用间接运算符和中提琴打印出来,我有一个输出。不起作用的是 p 没有被初始化。我究竟如何使用函数来初始化指向堆的指针?
您的问题是您正在按值传递指针。
因此,该函数stuff()
获取指针的副本。
void stuff(int * p) // This is a copy of the value you passed in
{
p = new int; // Here you modify the local copy.
} // The external value of p is unaffected.
有几种方法可以解决这个问题。但我认为最好的方法是返回函数的结果值(而不是传递它(。
int* stuff()
{
return new int;
}
那么用法是
p = stuff();
但是您可能正在尝试学习如何获取函数来更改对象的值。在这种情况下,您需要传递对对象的引用。
void stuff(int*& p) // The & means it is a reference to int*
{
p = new int;
}
用法:
stuff(p); // same as your original code.
在这里,您将对p
的引用传递到函数中。引用是现有对象的另一个名称。对函数中的引用所做的任何更改都会镜像到函数外部的对象中。
这似乎是您要做的。stuff
p
是本地的,因此将在stuff
年底被销毁。要从main
访问p
,您需要将指向它的指针传递到stuff
中。因此,stuff
应该期待指向指针的指针。
#include <iostream>
void stuff(int ** p)
{
*p = new int;
}
int main()
{
int * p;
stuff(&p);
*p = 1;
std::cout << *p << std::endl;
delete p;
return 0;
}
在你的实现函数中,工作人员将一个单位化的int*放入它的堆栈中,并为一个int分配内存。问题是 p 变量在主函数中没有更新。 有办法解决这个问题,但它不是那么优雅。
#include <iostream>
void stuff(int** p) {
*p = new int;
}
int main()
{
int * p;
stuff(&p);
*p = 1;
std::cout << *p << std::endl;
return 0;
}
这可以做你想做的事。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 应用程序仅在安装了 Visual Studio 的 PC 上启动.这种行为的原因可能是什么
- 不同向量启动作为类成员与方法中不同的矢量启动背后的原因是什么?
- 在一台有n个内核的机器中,确定要启动的线程数的最佳方法是什么?(C++)
- 结束使用 ShellExecute 函数启动的C++程序的最佳方法是什么?