【问题标题】:Multiple memory address in C [closed]C中的多个内存地址[关闭]
【发布时间】:2013-10-04 00:24:23
【问题描述】:

据我了解,一个字节由 8 位或字节组成,并且它具有分配给它的地址,我的问题是,如果我要求 2 个字,我会得到 4 个不同的地址,还是我会为整个字获得一个地址?任何解释将不胜感激。谢谢

【问题讨论】:

  • 你在问一个棘手的问题。一个单词是一个字符数组。您有一个指向开头的地址,但是每个字符都有自己的地址,但指向 char 数组的指针仍然指向位置 0。
  • 你应该更具体,通过显示你的代码。 "if I asked for 2 words" 是什么意思?
  • C 和 C++ 以 chars 而非字节数计。 char 可以是 7、8、9、16 位或其他任何值,具体取决于您的平台。
  • @Chemistpp 这个问题是在询问指令集大小的单词吗?
  • 我问的是位和字节,一个字是 2 个字节,我没有提到任何关于字符的内容,不过感谢您的 cmets

标签: c++ c memory-management computer-science


【解决方案1】:

通常认为任何对象或变量的“地址”是该变量中第一个(最低)字节的地址。因此,如果您有一个 std::uint64_t 类型的变量(8 个字节),则指向该变量的指针将指向它的第一个字节,而以下 7 个地址包含其他 7 个字节。现在,存储这些字节的顺序取决于您的实现(查找 little-endian 与 big-endian 架构)。

希望对您有所帮助。

【讨论】:

  • 感谢这加强了@Steve Jessop 的回答,实际上我昨天刚刚了解了小端和大端。谢谢林恩
【解决方案2】:

如果你进行分配,那么整个分配都有一个地址,其中的每个字节也有一个地址。

分配中第一个字节的地址等于分配的地址,其余字节从那里开始有连续的地址。

这里的“进行分配”包括全局变量、自动变量、newmalloc,以及任何为特定用途分配内存的东西。用技术术语来说,C 和 C++ 中的每个对象都是一系列具有连续地址的字节。

如果您的系统使用虚拟内存(几乎所有东西都使用),那么地址在 虚拟 地址空间中是连续的。它们在物理内存中不需要是连续的,但是虚拟内存的全部意义在于您(程序员)可以忽略物理内存中的内容。

【讨论】:

  • 感谢您的明确回答。因此,如果我要分配类似 char s[] = "test" 的东西,我会得到整个数组的地址,但也会得到 s[0], s[1],s[2],s[4] 的连续地址,对吗?
  • @LeandroVillagran: 是的,s[0] ... s[3] 将具有值 't''e''s''t's[4] 将具有值 @987654332 @(它是 nul 终止字符)。您还可以看到sizeof(s)5
  • 感谢您的解释@Steve Jessop 我真的很困惑,但现在我明白了
【解决方案3】:

在 C 中,除了位域之外的所有对象都是由一个或多个字节组成的:

C 2011 (N1570) 6.2.6.1 说“除了位字段,对象由一个或多个字节的连续序列组成,其数量、顺序和编码要么明确指定,要么由实现定义。”

当您访问由多个字节组成的对象时,例如 int(通常),该对象的所有字节都会为您访问。

对于处理器硬件本机支持的任何对象,都有加载和存储指令,它们采用单个地址,但对从该地址开始的多个字节进行操作。例如,有“加载字”指令从一个字节的地址开始加载四个字节。 (“单词”的大小没有标准;它因计算机体系结构而异。)对于由 C 实现创建的对象(例如具有多个成员的结构对象),C 实现必须使用多条指令加载和存储对象的所有部分。

【讨论】:

    【解决方案4】:

    错过了一个s[3],即't'。而s[4],即'\0'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2020-03-25
      • 2013-02-12
      相关资源
      最近更新 更多