我使用类型修饰符(远,近,巨)和普通变量而不是指针,发现这些指针类型修饰符仅适用于全局法线变量但是在使用时会生成错误块的本地变量。
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;
}
为什么这允许使用全局变量而不是局部变量。另外,变量最终会变成什么,即变成指针,具有更大范围的整数或完全不同的整数。
答案 0 :(得分:2)
near
,far
和huge
会影响存储变量的位置和内存类型。由于局部变量总是存储在堆栈中,因此在局部变量上使用这些修饰符没有任何意义。
请注意,这些功能都是16位DOS平台独有的。它们不用于现代系统 - 你可以放心地忽略它们。
答案 1 :(得分:0)
放置在堆栈上的所有东西都不能被修改。
您可以在堆叠中放置“非远变量”,但不能放置“远变量”。
您可以在堆栈中放置非远指针非远数据“,但不能将远指针指向非远数据**“。
你可以在堆栈中放置远远指向远数据的指针,但不能指向远指向远的指针数据“。
试试这个:
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;
这也是:
far int far* var;
变量(或函数)的存储(远,近,巨)修饰符放在变量类型之前。