1

此代码在 Turbo C 上运行,但不在 gcc 编译器上运行
错误:'*' 标记之前的语法错误

#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;
}

Turbo C output is :4, 4 , 2
你能解释一下 Turbo C 的输出吗?

4

3 回答 3

6

限定符huge,farnear, 是非标准的。因此,虽然它们可能在 Turbo C 中工作,但您不能依赖它们在其他编译器(例如 gcc)中工作。

于 2011-11-06T11:29:44.587 回答
5

Borland 的 DOS C/C++ 编译器支持多种内存模型。

内存模型是一种通过指针访问代码和数据的方法。

由于 DOS 运行在所谓real mode的 CPU 中,其中内存通过 asegment value和 an对offset value(通常为 16 位长)访问,内存地址自然为 4 字节长。

但是段值不需要总是明确指定。如果程序需要访问的所有内容都包含在一个中segment(在 16 字节边界上对齐的 64KB 内存块),则单个段值就足够了,并且一旦它被加载到 CPU 的段寄存器(CS、SS、DS、ES) ,程序只能使用 16 位偏移量来访问所有内容。顺便说一句,许多.COM-type 程序的工作方式完全一样,它们只使用一个段。

因此,您有 2 种可能的方式来访问内存,有或没有明确的段值。

在这些行中:

char huge *near *far *ptr1;
char near *far *huge *ptr2;
char far *huge *near *ptr3;

修饰符far,hugenear指定ptr1,ptr2ptr3将指向的对象的接近度。它们告诉编译器*ptr1*ptr2对象将“远离”程序的主/当前段,也就是说,它们将在其他一些段中,因此需要通过 4 字节指针访问,并且*ptr3object 是“near”,在程序自己的段内,一个 2 字节的指针就足够了。

这解释了不同的指针大小。

根据您为程序编译所选择的内存模型,函数和数据指针将默认为nearor faror or huge,除非您需要非默认指针,否则您无需显式拼写它们。

程序存储器模型有:

  • tiny: 1 段用于所有内容;近指针
  • 小:1个代码段,1个数据/堆栈段;近指针
  • medium:多个代码段,1个数据/堆栈段;远代码指针,近数据指针
  • 紧凑:1个代码段,多个数据段;近代码指针,远数据指针
  • large:多个代码和数据段;远指针
  • 巨大的:多个代码和数据段;巨大的指针

Huge指针没有指针的某些限制far,但操作起来较慢。

于 2011-11-06T12:37:06.210 回答
1

你忘了在变量之间加逗号:)。如果变量的作用域相同,则变量不能具有相同的名称。

于 2011-11-06T12:47:33.717 回答