【问题标题】:Memory address of variables in cc中变量的内存地址
【发布时间】:2015-01-04 11:46:19
【问题描述】:
// intialize a char variable, print its address and the next address
char charvar = '\0';
printf("address of charvar = %p\n", (void *)(&charvar));
printf("address of charvar - 1 = %p\n", (void *)(&charvar - 1));
printf("address of charvar + 1 = %p\n", (void *)(&charvar + 1));

// intialize an int variable, print its address and the next address
int intvar = 1;
printf("address of intvar = %p\n", (void *)(&intvar));
printf("address of intvar - 1 = %p\n", (void *)(&intvar - 1));
printf("address of intvar + 1 = %p\n", (void *)(&intvar + 1));

这是我在网上找到的代码,这是相关的输出

address of charvar = 0x7fff9575c05f
address of charvar - 1 = 0x7fff9575c05e
address of charvar + 1 = 0x7fff9575c060
address of intvar = 0x7fff9575c058
address of intvar - 1 = 0x7fff9575c054
address of intvar + 1 = 0x7fff9575c05c

我的疑问是为什么计算机中的内存地址是以十六进制格式存储的?我们知道一个 char 的大小是 8bits 或 1 byte,1 byte 在内存中是什么意思,即 charvar 的起始位的地址是 0x7fff9575c05f char+1 的地址不应该是 0x7fff9575c05f + 8bits 是 0x7fff9575c067,但似乎计算机中的一个内存位置是按 8 位或 1 字节组织的。我说的对吗?如果是,为什么?

【问题讨论】:

  • "为什么计算机中的内存地址是以十六进制格式存储的?" 您正在使用 @ 以十六进制表示法打印它987654323@ 格式说明符 - 仅此而已。值如何存储是完全不同的事情。
  • 那么 0x7fff9575c05f 指的是什么?
  • 地址,以十六进制形式打印。
  • 为什么这个问题被评为-1?

标签: c


【解决方案1】:

内存是按字节组织的,指针指向一个特定的字节,而不是单个位。原因可能是早期的计算机有 8 位寄存器/...并且通常一次处理整个字节。由于计算机在整个字节上运行,因此寻址字节而不是单个位更有意义。它还节省了地址空间,允许使用相同的指针大小来寻址更多的内存。

此外,内存地址并不是真正以十六进制格式存储的,它们只是在打印时以这种方式格式化。在内存中,它们是二进制数,就像计算机使用的所有其他数字一样。

【讨论】:

  • 因此在内部,值为 '101111111...' 的位置指的是 8 位/1 字节的段。所以基本上你可以控制一个完整字节的最大内存。十六进制转换只是二进制值的基本转换
  • 现代计算机甚至可能真正在内部使用更大的段。因此,例如计算机可能实际上总是在内部处理 4 字节块。但是为了兼容性,地址保持基于字节,处理器或编译器将适当地处理对单个字节的访问。
【解决方案2】:

您可以轻松访问的最小内存部分是一个字节,因此为每一位创建地址是没有用的。

【讨论】:

    【解决方案3】:

    内存是以字节而不是位来寻址的,事实上你必须接受这一点。一旦您在内存中获得某个字节的值,您就可以使用逻辑(按位)函数或运算符来处理它的位,例如 &、|、^、~ 等。请参阅http://www.cprogramming.com/tutorial/bitwise_operators.html

    此外,地址不是以十六进制格式存储的,十六进制格式只是数字打印到输出的格式。如果您在 printf 调用中使用其他格式化程序 %d 而不是 %p ,您将获得十进制格式。见http://www.cplusplus.com/reference/cstdio/printf/

    【讨论】:

    • 如果你使用%d而不是%p,你不会得到十进制格式;你得到未定义的行为。请不要鼓励未定义的行为。
    • FUZxxl - 你是对的,感谢您纠正我的错误。我已经有一段时间没有使用 printf 了。 :) 获得十进制格式所需的是将指针转换为适当长度的无符号整数并使用 %lu 格式说明符。
    • 如果您至少使用 C99,则可以使用 printf("%ju", (uintmax_t)ptr)uintmax_t 是最大的整数类型,因此足以包含每个可能指针的数字表示。
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多