为什么ptr3 2的大小?

Nee*_*raj 2 c pointers

//此代码的输出被观察为4 4 2?我不明白为什么它是2为ptr3?请帮忙

#include<stdio.h>

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

Kei*_*son 8

near,farhuge指针是非标准的.

在支持它们的实现中(通常用于非常旧的x86系统),内存中的特定位置可以由段和偏移量指定.甲near指针只包含一个偏移,离开段隐含的.因此,它比far指针需要更少的空间.

现代编译器不使用任何这些关键字.我建议你找一个更新的编译器; 有很多免费的.

有关更多信息,请参阅此问题.

顺便提一下,printf的"%d"格式需要一个类型的参数int; sizeof产生类型的结果size_t,这是一种不同的类型.您可以将printf通话更改为:

printf("%d, %d, %d\n", (int)sizeof ptr1, (int)sizeof ptr2, (int)sizeof ptr3);
Run Code Online (Sandbox Code Playgroud)

(现代的方法是:

printf("%zu, %zu, %zu\n", sizeof ptr1, sizeof ptr2, sizeof ptr3);
Run Code Online (Sandbox Code Playgroud)

但支持nearfar指针的实现可能不够现代,无法支持"%zu",这是在C99中引入的.)

  • @ShinTakezou:支持`near`和`far`指针的实现不太可能支持``%zu'`. (3认同)