gpt4 book ai didi

c++ - &a 的不同内容

转载 作者:太空宇宙 更新时间:2023-11-03 10:30:23 25 4
gpt4 key购买 nike

我希望更好地理解以下 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 意识。

关于c++ - &a 的不同内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18300558/

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