gpt4 book ai didi

c++ - 当(错误地)取消对指针的引用时,我如何收到以下输出?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:14:56 24 4
gpt4 key购买 nike

与其说这不是我需要解决的问题,不如说我犯了一个错误导致了奇怪的输出,我很好奇发生了什么。

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

cout << **point2 << endl;

这会按预期输出“y”。

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

cout << *point2 << endl;

然后输出将包括在初始变量 var 之后声明的任何后续变量。
例如,在下面的代码中,也将包含 var2,用于输出“yn”,以及其他变量,例如

char var3 = 'a';
char var4 = 'b';

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

cout << (void *) &var <<endl;

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

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

代码:

#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;
}

最佳答案

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

实际上发生的是输出运算符 <<从内存中读取连续的字节,直到它达到零(“字符串终止符”)。在您的情况下,编译器已将变量的存储空间并排放置,这就是为什么您会看到两者都在“字符串”中输出的原因。

关于c++ - 当(错误地)取消对指针的引用时,我如何收到以下输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44808392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com