当(错误地)取消引用指针指针时,如何接收以下输出?

Pot*_*rus 1 c++ pointers

这不是一个我需要解决的问题,更多的是我犯了一个错误导致奇怪的输出,我很好奇发生了什么.

因此,如果point1是指向char"var"的指针,而point2是指向指针point1的指针,则正确地取消引用point2,如下所示:

cout << **point2 << endl;
Run Code Online (Sandbox Code Playgroud)

哪个会像预期的那样输出"y".

但是,如果我错误地取消引用指针,如下所示:

cout << *point2 << endl;
Run Code Online (Sandbox Code Playgroud)

然后输出将包括在初始变量var之后声明的任何后续变量.
例如,在下面的代码中,对于输出"yn",还包括var2,以及其他变量,例如

char var3 = 'a';
char var4 = 'b';
Run Code Online (Sandbox Code Playgroud)

似乎也包含在"ynab"的输出中.
我想我理解它是如何发生的,并通过以下方法输出每个变量的内存地址:

cout << (void *) &var <<endl;
Run Code Online (Sandbox Code Playgroud)

这证实了每个变量在内存中是相邻的,但是我不确定它为什么会发生.

为什么不正确地解引用指针的指针似乎返回连续的变量?

码:

#include <stdio.h>
#include <iostream>

using namespace std;

char var = 'y';
char var2 = 'n';

//Declare point1 as a pointer to a char
char* point1 = &var;

//Declare point2 as pointer to pointer to char
char** point2 = &point1;

int main(int argc, char **argv)
{
    cout << "Dereference point1: " << *point1 << endl;

    cout << "Dereference point2: " << **point2 << endl;
    cout << "Bad dereference of point2: " << *point2 << endl;

    cout << "Var: " << var << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 9

表达式*point2的类型char *被视为字符串.如果它不是真正的字符串那么你有未定义的行为,这真的是故事的结尾.

实际上发生的是输出操作符<<从内存中读取连续的字节,直到它达到零("字符串终结符").在您的情况下,编译器已将变量的存储放在彼此旁边,这就是为什么您看到两者都在"字符串"中输出.

  • @veganaiZe程序超出了单个字符变量的范围.走出界限总是UB. (3认同)
  • 但要求连续不是必需的.一些存储可以通过量子纠缠链接在冥王星上,一些通过palantir从Mordor进入,其余部分藏在马里亚纳海沟的底部,并通过心灵感应鱼通过Aquaman进行通信.只要它满足自动和动态存储的要求,C++将允许最多的幻想. (3认同)
  • @veganaiZe https://isocpp.org/在徽标下方的左上角,您可以找到指向下一个C++标准的最新草稿的链接. (2认同)