此代码在Turbo C上运行但在gcc编译器上运行?

时间:2011-11-06 11:23:28

标签: c gcc turbo-c

此代码在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输出为:4,4,2   你能解释一下Turbo C的输出吗?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

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

由于DOS在CPU的所谓real mode中运行,其中通过成对segment valueoffset value(每个通常为16位长)访问内存,内存地址自然是4个字节长。

但不一定要明确指定段值。如果程序需要访问的所有内容都包含在一个segment(在16字节边界上对齐的64KB内存块)中,则单个段值就足够了,并且一旦加载到CPU的段寄存器(CS,SS)中,DS,ES),程序只需使用16位偏移即可访问所有内容。顺便说一下,很多.COM类型的程序都是这样的,它们只使用一个段。

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

在这些方面:

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

修饰符farhugenear指定ptr1ptr2ptr3将指向的对象的近似值。他们告诉编译器*ptr1*ptr2对象将远离程序的主/当前段,即它们将在其他一些段中,因此需要通过4字节指针访问,*ptr3对象在程序自己的段内“接近”,并且2字节指针就足够了。

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

根据您为程序编译选择的内存模型,函数和数据指针将默认为nearfarhuge,并且可以避免拼写出来明确地,除非你需要非默认指针。

程序存储器模型是:

  • tiny:1段用于一切;靠近指针
  • small:1个代码段,1个数据/堆栈段;靠近指针
  • medium:多个代码段,1个数据/堆栈段;远程代码指针,靠近数据指针
  • compact:1个代码段,多个数据段;靠近代码指针,远数据指针
  • large:多个代码和数据段;远点指南
  • huge:多个代码和数据段;巨大的指针

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

答案 2 :(得分:1)

你忘了在变量之间加一个逗号:)。 如果变量的范围相同,则变量不能具有相同的名称。