【问题标题】:Why Is The Size of ptr3 2?为什么ptr3的大小是2?
【发布时间】:2012-12-19 07:13:09
【问题描述】:

//观察到这段代码的输出是 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;
}

【问题讨论】:

  • 什么系统?什么编译器?这不是标准的 C 语法。
  • nearfarhuge 表明它是某种古老的、过时的基于 DOS 的编译器。也许是 Borland C?
  • 标准将sizeof(char)定义为1。您没有其他保证。
  • 在这种情况下,答案是“去阅读你的编译器文档”。
  • @E F:是什么让你相信那个指针的大小2 是不寻常的,以至于你甚至问过这个问题?为什么不2?在某种程度上,这就像问为什么2 + 2 等于4。如何回答这样的问题?

标签: c pointers


【解决方案1】:

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"。)

【讨论】:

  • 还是使用 %zu ? (前提是他更新到符合 C99 的编译器...)
  • @ShinTakezou:支持nearfar 指针的实现不太可能支持"%zu"
  • 1分钟后想起来:)
  • 我不确定这到底有多普遍,但较小的嵌入式平台(在智能手机之前的意义上)有时编译器的选择非常有限,这些编译器可以很好地使用近/远关键字.但是,是的,+1,我认为你通过说近指针更小来确定答案。
  • @KeithThompson 想象一下像 AVR AT(x)mega 等平台 - 它们有一种 near/far 并且(部分)符合 C99...
【解决方案2】:

farnearhuge 是旧 DOS 编译器中使用的概念。

For more you can see this link.

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

【讨论】:

    【解决方案3】:

    只是为了消除一层混乱,所以你可以使用other answer

    near 指针的声明如下所示:

    type near* variable;
    

    或者像这样:

    near type* variable;
    

    其中type 是任何类型。在您的示例中,有人试图混淆您,因为type 本身就是一个指针类型:char far *huge *。但是,不管它指向什么,一个near指针占用2个字节。

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-29
        • 2017-05-02
        • 1970-01-01
        • 2010-11-24
        • 2017-07-30
        • 1970-01-01
        • 2018-08-15
        • 1970-01-01
        相关资源
        最近更新 更多