代码之家  ›  专栏  ›  技术社区  ›  Nick Bolton

使用c,为什么char*类型在一个地方是2,而在另一个地方是4?

c
  •  9
  • Nick Bolton  · 技术社区  · 14 年前

    从一个关于 Practice C test 从geekinterview来看,为什么 ptr1 2,而 ptr2 ptr3 尺寸是4码吗?

    main() 
    { 
    char near * near *ptr1; 
    char near * far *ptr2; 
    char near * huge *ptr3; 
    printf("%d %d %d",sizeof(ptr1),sizeof(ptr2),sizeof(ptr3)); 
    } 
    

    输出:2 4 4

    2 回复  |  直到 14 年前
        1
  •  9
  •   AndiDog    14 年前

    在使用分段内存的体系结构(如x86实模式)时,可以区分三种类型的指针地址(例如段中的x86:偏移表示法):

    • 近的

      仅存储偏移部分(16位)-解析此类指针时,当前数据段偏移将用作段地址。

    • 远的

      存储段和偏移地址(每个16位),从而在内存中定义一个绝对物理地址。

    • 巨大的

      与远指针相同,但可以标准化,即。 0000:FFFF + 1 将被适当地包装到下一个段地址。

    在现代操作系统上,这不再重要,因为内存模型通常是扁平的,使用虚拟内存而不是直接寻址物理内存(至少在第3环应用程序中)。

        2
  •  5
  •   Reed Copsey    14 年前

    因为你用的是近指针对。 far pointers . 在这种情况下,远指针需要两个16位地址。

    (“巨大”说明符是一种非标准的远指针语法,用于处理某些特定的远指针情况…)