//此代码的输出被观察为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;
}
答案 0 :(得分:8)
near
,far
和huge
指针都是非标准的。
在支持它们的实现中(通常用于非常旧的x86系统),内存中的特定位置可以由段和偏移量指定。 near
指针仅包含偏移量,使该段隐含。因此,它需要比far
指针更少的空间。
现代编译器不使用任何这些关键字。我建议你找一个更新的编译器;有很多免费的。
有关详细信息,请参阅this question。
顺便提一下,printf的"%d"
格式需要int
类型的参数; sizeof
生成size_t
类型的结果,这是一种不同的类型。您可以将printf
来电更改为:
printf("%d, %d, %d\n", (int)sizeof ptr1, (int)sizeof ptr2, (int)sizeof ptr3);
(现代的方法是:
printf("%zu, %zu, %zu\n", sizeof ptr1, sizeof ptr2, sizeof ptr3);
但支持near
和far
指针的实现可能不够现代,不足以支持C99中引入的"%zu"
。)
答案 1 :(得分:1)
答案 2 :(得分:1)
只是为了消除一层混乱,所以你可以使用other answer。
near
指针的声明如下:
type near* variable;
或者像这样:
near type* variable;
type
是哪种类型。在您的示例中,有人试图让您感到困惑,因为type
本身就是指针类型:char far *huge *
。但是,无论它指向什么,near
指针占用2个字节。
(我猜有人试图故意混淆你,因为实际代码中不会出现这样的结构)
答案 3 :(得分:1)
我认为您使用的是旧的编译器(可能是turboc c)。最新的编译器不支持此功能。
附近指针没有选择器 - 它们有一个隐含的选择器。他们可以在286及更早版本的虚拟地址空间和646或更高版本的地址空间4Gb上访问64k。
远指针有一个显式选择器。但是,当你对它们进行指针运算时,选择器不会被修改。
巨大的指针有一个明确的选择器。当你对它们进行指针运算时,虽然选择器可以改变。