对普通变量使用类型修饰符(near、far、huge)

Use of type modifiers(near,far,huge) with normal variables

我使用了类型修饰符(far,near,huge)普通变量而不是指针,发现这些指针类型修饰符只适用于全局普通变量但是一个错误与块的局部变量一起使用时生成。

int near a,far b,huge c;

int main()
{
 int d,e,f;

// int near a,far b,,huge c;
// long int near a,far b,huge c;
// long long int near a,far b,huge c;

//printf("\n size of a=%d ,b=%d ,c=%d ,d=%d ,e=%d ,f=%d",sizeof(a),sizeof(b),sizeof(c),sizeof(d),sizeof(e),sizeof(f));

printf("\n address of a=%u ,b=%u ,c=%u ,d=%u ,e=%u,f=%u",&a,&b,&c,&d,&e,&f);
  return 0;
  }

为什么这允许使用全局变量而不是局部变量。此外,变量最终变成了什么,即它变成了一个指针,一个具有更大范围的整数或完全是其他东西。

nearfarhuge 影响变量存储的位置和类型。由于局部变量总是存储在堆栈中,因此对局部变量使用这些修饰符没有任何意义。

请注意,这些功能都是 16 位 DOS 平台独有的。它们未在现代系统中使用——您可以安全地忽略它们。

放在堆栈上的所有内容都无法修改。

您可以在堆栈中放置“非远变量”,但不能放置“变量”。

您可以在堆栈中放置“non-far 指向 non-far 数据的指针”,但不能放置“far 指向 non-far 数据**”。

您可以在堆栈中放置“non-far 指向 far 数据的指针”,但不能放置“far” 指向 far 数据的指针。

试试这个:

far int       var        = 0; /* OK */
far int far* far_var_ptr = &var; /* OK: far pointer to far data*/ 
int far*     var_ptr     = &var; /* OK: non-far pointer to far data*/ */

int main()
{
int far*      var_ptr2    = &var; /* OK: Non-far ptr to far data */
far int far* far_var_ptr2 = &var; /* Fail: far ptr to far data */ 
far int       var2         = 0;     /* Fail: far data */
}

关键是不能在栈上定义far数据。堆栈上的变量是:

放置在定义的内存范围内

它的确切位置取决于之前的调用堆栈:编译时无法获知

这不是远数据:

int far* var;

它是一个未修改的指向远数据的指针。指针本身只是一个未修改的数字,它指向远段中的数据(特定于平台)。

这是远数据:

far int* var;

还有这个:

far int far* var;

变量(或函数)的存储(far,near,huge)修饰符放在变量类型之前。