2012-05-31 2 views
-1

я запустить следующий код на Turbo C компилятор и GNU компилятор:же указатель, показывающий различные размеры в разных компиляторах

int main() 
{ 
    char *cptr; 
    printf("%d\n",sizeof(cptr)); 
    return 0; 
} 

и я имел выход «» на ходу Turbo C и выход " 'на компиляторе GNU. Я на 64-битной машине. Может ли кто-нибудь объяснить факт, связанный с такими различиями?

+4

Добро пожаловать в 21-й век. –

+0

@BlagovestBuyukliev Хорошие комментарии :) – RolandXu

ответ

3

Turbo C, который является винтажным, вероятно, предназначен для 16-разрядной DOS-машины, которая по умолчанию имеет небольшие указатели.

1

Turbo C - это 16 бит, поэтому вы получаете 2 для sizeof(cptr).

1

Просто потому, что ваш компьютер изначально 64-разрядный, не означает, что каждый бит программного обеспечения, который вы можете запустить на нем, воспользуется им. 64-разрядные машины (и поддерживающее программное обеспечение) предназначены для совместимости с 32-разрядными версиями. Программное обеспечение, написанное для 32-битных машин, может работать в результате.

+0

В основном, что вы хотите сказать, мой компилятор Turbo C - это 16 бит, а компилятор GNU - 32 бит ??? –

0

В основном указатель sizeof представляет собой размер целочисленного типа, используемого указателем. Точно говоря, 32-битный int на 32-битной платформе, 64-битный int (длинный) на 64-битной платформе. Но будьте осторожны, это также зависит от используемого вами компилятора. Это означает, что даже на 64-битной платформе, если вы используете 32-битный компилятор (или даже 16 бит), для типа указателя будет использоваться 32-битный int. Из вашего результата видно, что вы, компилятор turbo C, определенно не 64 бит (должно быть 16 бит, если я не помню его неправильно). Хотя ваш gcc-компилятор является реальным 64-битным.

+0

это выглядит, мой Turbo C - 16 бит, а GNU - 32 бит. Есть ли у вас какой-либо способ узнать архитектуру компилятора, будь то 16 или 32 или 64 бит? –

+0

Я думаю, что простой способ узнать, просто распечатать значение sizeof (int) и sizeof (long). Поскольку int и long являются платформой (зависимость от компилятора), что означает, что на 16-битной платформе (компилятор), int равно 16 бит, в противном случае 32. на 64-битной платформе и компиляторе, длиной 64 бит, в противном случае 32. Итак: 1. if sizeof (int) - 2 байта (16 бит), то у вас есть определенно 16-битный компилятор. 2, если sizeof (long) равен 4 байтам (64 бит), тогда у вас есть 64-битный компилятор. 3. Другие случаи 32-битный компилятор. Надеюсь, он поможет – who9137

+0

на вашем втором решении 4 байт (64 бит) как ?? –

0

Различные платформы могут иметь разные размеры для любого заданного типа указателя. Все зависит от базовой архитектуры памяти и адресного пространства, доступного для любого процесса. Никогда не предполагайте, что типы указателей всегда будут иметь определенный размер.

2

Если мы рассматриваем компилятор Turbo-C на основе DOS, адреса ограничиваются диапазоном 0x0000 до 0xFFFF (0-65535), поэтому размер указателя составляет 2 байта. С другой стороны, если мы рассмотрим 32-битный компилятор GNU, там создаются миллионы адресов, поэтому размер составляет 4 байта.

Размер указателя зависит только от компилятора C, который вы используете, но не от ОС.

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