我希望更好地理解以下 3 个示例。
这是我对以下代码示例的问题。
- 例如。 1.例子有道理,它输出的地址是int a被储存了。
- 例如。 2. 意义不大。我觉得是这样的因为char本身指向char?
- 例如。 3. 让我困惑。在输出第一个字符输出始终是存储在字符中的 on。但是附加的字符是什么,为什么保存后会出现&a 到一个字符指针?
最后如何输出一个char变量所在内存位置的地址?
例如。 1
main(void)
{
int a = 1;
cout << &a;
}
输出内存地址ex。 0x7fff4241b7b4
例 2。
main(void)
{
char a = 'a';
cout << &a;
}
输出字符a。前任。 一个
例如。 3.
main(void)
{
char a = 'a';
char *b = &a;
cout << &a;
}
输出a��:��
第一个指针匹配 operator<<(const void*)
输出指针值;第二场和第三场比赛operator<<(const char*)
这将输出一个以 null 结尾的字符串。
字符 a
是堆栈上的一个值,所以第一个字节之后的字节是否为空是完全不确定的,幸运的是在中间情况下它后面跟着一个空字节,但在第三种情况下后面的一些字节不是空字节并且你得到损坏的 UTF-8 字符。您设置指针这一事实不会影响程序的运行,但堆栈帧的设置不同,例如 GCC 会发出 movb $97, -9(%rbp)
。汇编程序操作码将字节设置在堆栈上,将 char 放入非对齐地址。我电脑上的堆栈布局是这样的(64位)
| x | x | x | x | x | x | a | b | b | b | b | b | b | b | b |
^
RPB
因此 a
然后直接在堆栈上,后面跟着 b 指针值;我在我的机器上运行时看到的垃圾来自这个指针值。事实上,如果我将 ex 3 更改为
#include <iostream>
int main(void)
{
char a = 'a';
long b = 0x68676665646362l;
std::cout << &a;
}
我得到输出
abcdefgh
当然这是未定义行为的一个例子;使用其他编译器编译,在其他平台上运行,程序也可以按标准崩溃,打印哈姆雷特全文或实现 self 意识。
我是一名优秀的程序员,十分优秀!