使用C,为什么char*类型在一个地方的大小为2,而在另一个地方为4?

Nic*_*ton 9 c

从上一个问题实践C测试从GeekInterview,为什么大小ptr12,而ptr2ptr3是4的大小?

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

输出:2 4 4

And*_*Dog 9

在处理具有分段存储器的架构(如x86实模式)时,可以区分三种类型的指针地址(段中x86的示例:偏移表示法):

  • 仅存储偏移部分(16位) - 当解析这样的指针时,当前数据段偏移将用作段地址.

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

  • 巨大

    与指针相同,但可以标准化,0000:FFFF + 1即将适当地缠绕到下一个段地址.

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


Ree*_*sey 5

因为你使用近指针和远指针.在这种情况下,远指针需要两个16位地址.

("巨大的"说明符是一个非标准的远指针语法,用于处理一些特定的远指针情况......)