2

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

#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

4 回答 4

8

near, far, 和huge指针是非标准的。

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

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

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

顺便说一句,printf 的"%d"格式需要一个 type 的参数intsizeof产生 type 的结果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指针的实现可能不够现代,无法支持"%zu",这是在 C99 中引入的。)

于 2012-12-19T07:22:13.077 回答
1

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

有关更多信息,您可以查看此链接。

这将解释有关这些如何在内部实现的所有内容。由于这个实现,你得到这样的大小。

于 2012-12-19T07:39:44.153 回答
1

只是为了消除一层混乱,因此您可以使用其他答案

指针的声明near如下所示:

type near* variable;

或者像这样:

near type* variable;

type任何类型在哪里。在您的示例中,有人试图使您感到困惑,因为type它本身就是指针类型:char far *huge *. 但是,无论它指向什么,一个near指针都占用 2 个字节。

(我猜有人试图故意混淆你,因为这样的构造不可能出现在真实代码中)

于 2012-12-19T07:43:05.283 回答
1

我认为您使用的是旧的编译器(可能是 turboc c)。最新的编译器不支持此功能。

Near指针没有选择器——它们有一个隐含的选择器。他们可以访问 286 及更早版本上的 64k 虚拟地址空间和 386 或更高版本上的 4Gb 地址空间。

指针有一个明确的选择器。但是,当您对它们进行指针运算时,选择器不会被修改。

巨大的指针有一个明确的选择器。当您对它们进行指针运算时,尽管选择器可以更改。

于 2012-12-19T09:07:20.180 回答