我有这段代码并且有效:
void InitPointer(int** pp)
{
*pp = new int{ 10 };
}
int* p{ nullptr };
InitPointer(&p);
你能帮我弄清楚它是如何工作的吗?原始指针 int * p 无处可寻。我怎么能写到哪里? 例如,此代码抛出rte:
int* p{ nullptr };
*p = 10;
答案 0 :(得分:4)
取消引用nullptr是未定义的行为:
int* px = nullptr;
有时需要将指针标记为无效。这可以 通过将nullptr赋值给指针来实现。这个指针是 调用空指针并取消引用它会导致未定义 行为。
来源:http://en.cppreference.com/book/pointers
这正是
发生的事情int* p{ nullptr };
*p = 10;
虽然在第一种情况下你没有写到任何地方,因为代码
void InitPointer(int** pp)
{
*pp = new int{ 10 };
}
int* p{ nullptr };
InitPointer(&p);
将指针初始化为值为10的新整数。它大致以这种方式工作:
int* p{ nullptr };
Address | Variable Name | Value
0x10 p nullptr
InitPointer(&p);
Address | Variable Name | Value
0x10 p nullptr
0x20 pp 0x10
*pp = new int{ 10 };
Address | Variable Name | Value
0x10 p 0x30
0x20 pp 0x10
0x30 - 10 (int)
因此你的p指针现在指向有效的内存(以后应该被释放)。
答案 1 :(得分:2)
您的示例中有两个指针。第一个指向无处,但第二个指向第一个。并使用指向指针的指针,您将指针指向某处 - 听起来很容易吗?也许这会更好:
|---------| |-------|
| nullptr | <----------X |
|--- p----| |--pp---|
因此,pp
指向p
的“内容”。使用它,该函数会更改p
指向的内容:
|----| |---------| |-------|
| 10 | <-----------X | <----------X |
|----| |----p----| |--pp---|
答案 2 :(得分:2)
你不是无处可写。您将&p
(指向p
的指针)传递给函数(因此第二个*
,指示指向指针的指针),然后取消引用该指针以写入{ {1}}本身。
第二个示例没有额外的间接级别,只是尝试写入p
指向的不存在的对象,因此错误。