C 对正常变量使用类型修饰符(近、远、大)

C 对正常变量使用类型修饰符(近、远、大),c,pointers,data-structures,turbo-c,C,Pointers,Data Structures,Turbo C,我将类型修饰符(远、近、大)用于普通变量而不是指针,发现这些指针类型修饰符仅适用于全局普通变量,但与块的局部变量一起使用时会产生错误 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=%

我将类型修饰符(远、近、大)用于普通变量而不是指针,发现这些指针类型修饰符仅适用于全局普通变量,但与块的局部变量一起使用时会产生错误

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

为什么允许使用全局变量而不允许使用局部变量。此外,变量最终会变成什么,即它会变成指针、一个范围更大的整数或完全是别的什么。

near
far
mage
影响变量存储在何处以及存储在何种类型的内存中。因为局部变量总是存储在堆栈上,所以对局部变量使用这些修饰符没有任何意义


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

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

您可以在堆栈中放置“non-far变量”,但不能放置“far变量”

您可以在堆栈中放置“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 */
}
关键是不能在堆栈上定义远端数据。堆栈上的变量包括:

放置在定义的内存范围内

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

这是一个不远的数据:

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

这是最新的数据:

int far* var;
far int* var;
这也是:

far int far* var;

变量(或函数)的存储(远、近、大)修饰符放在变量类型之前。

我知道这些修饰符可以忽略,但这纯粹是为了研究目的(在16位DOS:D中编写TSR),我甚至在gcc文档中找不到任何东西。此外,这些类型修饰符用于通过增加指针变量的大小来访问数据或代码段中的数据。@NeoR从来没有用于实模式DOS的GCC版本。DJGPP项目在32位保护模式下运行。@M.M.Thank不知道代码实际上也是用16位Turbo-C编写的,但是现在很难找到Turbo-C的手册,尽管我确实设法获得了官方IBM Turbo-C手册的数字副本,但仍然无法得出任何结论。我有一个(非常松散的格式)关于自动垃圾收集器的想法,由于局部变量通常基于EBP偏移量-我认为取而代之的是获取数据段/远端地址可能会很有用。。好吧,做一些鬼鬼祟祟的事情,用某种双链接列表来连接实际的堆分配对象,比如。。根据当前堆栈帧轻松进行范围外检查。我猜那是半身像…:/