2015-10-27 2 views
1

Я использовал модификаторы типов (далекие, близкие, огромные) с обычными переменными, а не указатели и обнаружил, что эти модификаторы типа указателя применимы только для глобального нормального переменная, но при использовании с переменной, локальной для блока, генерируется ошибка.Использование модификаторов типа (рядом, далеко, огромно) с нормальными переменными

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

Все, что находится в стеке, не может быть изменено.

Вы можете разместить «не-далеко переменные» в стеке, но не «далеко переменные».

Вы можете разместить «не-далеко указатели не-далеко данные» в стеке, но не «далеко указатели не-далеко данные **».

Вы можете разместить «не-далеко указатели далеки данных» в стеке, но не «далеко указателей далеки данных».

Попробуйте это:

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; 

хранения (далеко, близко, огромный) модификатор переменной (или функции) ставится перед переменной тип.

2

near, far и huge влияют на то, где и в каком типе памяти хранится переменная. Поскольку локальные переменные всегда хранятся в стеке, использование этих модификаторов для локальных переменных не имеет никакого смысла.

Обратите внимание, что эти функции уникальны для 16-разрядной платформы DOS. Они не используются в современных системах - вы можете смело игнорировать их.

+0

Я понимаю, что их можно игнорировать, но это было сделано исключительно для исследовательских целей (запись TSR в 16-разрядной DOS: D) Я даже не мог найти что-либо в документах gcc. – NeoR

+0

Кроме того, эти модификаторы типа были использованы для доступа к данным в сегменте данных или кода, увеличивая размер переменной указателя. – NeoR

+1

@NeoR никогда не было версии GCC для реального режима DOS. Проект DJGPP работает в 32-битном защищенном режиме. –

Смежные вопросы