当我从去年COUT声明很奇怪的输出,不知道会是什么造成这样的:奇怪的输出使用字符双指针
char ex1_val = 'A';
char* ex1;
ex1 = &ex1_val;
cout << *ex1 << endl;
char** ex2;
ex2 = &ex1;
cout << *ex2 << endl;
这里是我的输出:
A
A����
当我从去年COUT声明很奇怪的输出,不知道会是什么造成这样的:奇怪的输出使用字符双指针
char ex1_val = 'A';
char* ex1;
ex1 = &ex1_val;
cout << *ex1 << endl;
char** ex2;
ex2 = &ex1;
cout << *ex2 << endl;
这里是我的输出:
A
A����
ex2
声明作为char**
,这意味着它是指向指向char的指针。
当您打印的*ex2
的内容,你解引用它一次,所以*ex2
类型是为char的指针。
有效,编译器假定,要打印C风格的字符串,这是一个NULL
封端的字符串。因此它会打印存储在内存中的所有字节,从存储在ex1_val
中的A
开始,然后是随机值,之后直接存储,直到获得NULL
字符。
这实际上是一个非常糟糕的情况,因为你永远不知道当或如果有一个在内存中的NULL
。您最终可能会尝试访问您不允许使用的内存区域,这可能会导致应用程序崩溃。这是未定义行为的示例(UB)。
要通过ex2
指针打印出的ex1_val
实际内容,你需要做这样的:
cout << **ex2 << endl;
其中typeof(**ex2)
是一个实际的char
。
当取消引用ex2
(在*ex2
)你得到一个指针指向一个char
(即char*
),并且operator<<
overload处理char*
输出它作为一个C风格零结尾串。
既然*ex2
没有指向以零结尾的字符串,只有一个字符,你会得到未定义的行为。
你想干什么cout << **ex2 << endl;
ex2
,因为你已经宣布它作为一个指针的指针一个字符。做*ex2
只会让你指向它所指向的指针的地址。
是不是**假设是一个二维数组? – AchmadJP
'cout'不是[tag:c] – LPs
'* ex2'是一个指向c风格字符串的指针,例如。 cout打印字符,直到找到null终止符 – nikniknik2016