这不是一个我需要解决的问题,而是我犯了一个错误导致奇怪输出的情况,我很好奇发生了什么。< / p>
因此,如果point1是指向char&#34; var&#34;的指针,而point2是指向指针point1的指针,则按如下方式正确解引用point2:
cout << **point2 << endl;
哪个会输出&#34; y&#34;如预期的那样。
但是,如果我错误地取消引用指针,如下所示:
cout << *point2 << endl;
然后输出将包括在初始变量var之后声明的任何后续变量 例如,在下面的代码中,对于&#34; yn&#34;的输出,还包括var2,以及其他变量,例如
char var3 = 'a';
char var4 = 'b';
似乎也包含在&#34; ynab&#34;的输出中 我想我理解 它是如何发生的,并通过以下方法输出每个变量的内存地址:
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;
}
答案 0 :(得分:9)
表达式*point2
的类型为char *
,它被视为字符串。如果它不是真正的字符串,那么你有未定义的行为,这真的是故事的结尾。
实际上发生的是输出运算符<<
从内存中读取连续的字节,直到它达到零(“字符串终结符”)。在您的情况下,编译器已将变量的存储放在彼此旁边,这就是为什么您看到两者都在“字符串”中输出。
答案 1 :(得分:3)
C ++认为指向char 的指针是字符串的开头。因此它会尝试继续打印,直到找到NULL
值。