为什么ptr3 2的大小?

时间:2012-12-19 07:13:10

标签: 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;
}

4 个答案:

答案 0 :(得分:8)

nearfarhuge指针都是非标准的。

在支持它们的实现中(通常用于非常旧的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);

但支持nearfar指针的实现可能不够现代,不足以支持C99中引入的"%zu"。)

答案 1 :(得分:1)

这个far nearhuge是旧DOS编译器中使用的概念。

For more you can see this link.

这将解释这些内部如何实施的一切。 由于这个实现,你得到这样的大小。

答案 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。

指针有一个显式选择器。但是,当你对它们进行指针运算时,选择器不会被修改。

巨大的指针有一个明确的选择器。当你对它们进行指针运算时,虽然选择器可以改变。