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

Dor*_*jay 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

cni*_*tar 6

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


Ale*_*nze 5

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

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

由于DOS在所谓real mode的CPU中运行,其中通过成对的a segment value和a offset value(每个通常是16位长)访问存储器,因此存储器地址自然是4个字节长.

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

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

在这些方面:

char huge *near *far *ptr1;
char near *far *huge *ptr2;
char far *huge *near *ptr3;
Run Code Online (Sandbox Code Playgroud)

修饰符far,hugenear指定该对象的邻近性ptr1,ptr2ptr3会指向.它们告诉编译器,*ptr1*ptr2对象将"远离"程序的主/当前段,也就是说,它们将位于其他一些段中,因此需要通过4字节指针访问,并且*ptr3对象在程序自己的段内"靠近",并且一个2字节的指针就足够了.

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

根据您选择适合您的程序编译在内存模型,函数和数据指针将默认为无论是nearfarhuge和饶你从拼写出来明确的,除非你需要非默认的指针.

程序存储器模型是:

  • 微小:一切都是一段; 靠近指针
  • small:1个代码段,1个数据/堆栈段; 靠近指针
  • medium:多个代码段,1个数据/堆栈段; 远程代码指针,靠近数据指针
  • 紧凑:1个代码段,多个数据段; 靠近代码指针,远数据指针
  • large:多个代码和数据段; 远点
  • 巨大的:多个代码和数据段; 巨大的指针

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