2012-06-30 2 views
0

Я попытался понять размер адреса, используемый для хранения переменных и указателей, указателей-указателей и указателей-указателей-указателей. Результаты несколько путают.Что объясняет этот простой вывод программы-указателя

Вот код:

#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char *** ppptr_string = NULL; 
    int  *** ppptr_int = NULL; 
    double *** ppptr_dbl = NULL; 

    char c=0; int i=0; double d=0; 

    printf("\n %d %d %d %d %d\n", sizeof(&ppptr_string), 
    sizeof(ppptr_string), sizeof(*ppptr_string), sizeof(**ppptr_string), 
    sizeof(***ppptr_string)); 
    printf("\n %d %d %d %d %d\n", sizeof(&ppptr_int), sizeof(ppptr_int),  
    sizeof(*ppptr_int), sizeof(**ppptr_int), sizeof(***ppptr_int)); 
    printf("\n %d %d %d %d %d\n", sizeof(&ppptr_dbl), sizeof(ppptr_dbl),  
    sizeof(*ppptr_dbl), sizeof(**ppptr_dbl), sizeof(***ppptr_dbl)); 


    printf("\n sizeof(char) = %d, sizeof(int) = %d, sizeof(double) = %d", 
    sizeof(c), sizeof(i), sizeof(d)); 
    printf("\n sizeof(&char) = %d, sizeof(&int) = %d, sizeof(&double) = %d", 
    sizeof(&c), sizeof(&i), sizeof(&d)); 

getch(); 
return 0; 
} 

Теперь путаница. Я вижу, что переменная-адрес на этом компьютере всегда имеет длину 2 байта. Независимо от типа переменной и независимо от ее переменной указателя. Но почему я получаю размер 4 для такого количества записей здесь? Указатель имеет размер 4 всегда независимо от типа. Адрес> <, в котором хранится переменная, имеет размер 2. И указанный указатель имеет размер в зависимости от типа.

Почему я получаю 4s в выводе для sizeof ??

Мой выход из Borland C++ 5,02 enter image description here

+1

conio.h? Является ли это компилятором MS-DOS? – src

+3

, пожалуйста, предоставьте вывод, потому что я не получаю, когда вы видите 4s и 2s. –

+1

Если вы получаете 4 для размеров указателя, это потому, что эти указатели имеют 4 байта на вашем компьютере. В стандарте языка не указывается, какой размер должен быть указатель. –

ответ

3

Если у вас есть тип T и указатель на указатель, как T*** ptr, то ptr, *ptr, **ptr сами по себе являются указателями. Вы, вероятно, работает на 32-битной системе (или компиляции приложения 32bit), так sizeof(ptr) == sizeof(*ptr) == sizeof(**ptr):

--- Program output --- 

4 4 4 4 1 

4 4 4 4 4 

4 4 4 4 8 

    sizeof(char) = 1, sizeof(int) = 4, sizeof(double) = 8 
sizeof(&char) = 4, sizeof(&int) = 4, sizeof(&double) = 4 

&ptr является адрес/указатель на T***, поэтому его размер составляет 4 тоже. Только если вы разыщите указатель на его максимальный уровень (***ptr), у вас будет фактический тип, а не другой указатель.

+0

Да, я использую 32-битную машину. Вот результат. Я получаю все 2s в первом столбце и понимаю, почему. Но причина получения 4s в других столбцах не имеет никакого смысла. Последняя строка не имеет 4s, а 2s на машине с 32-разрядной машины. – quantum231

+0

Какой компилятор вы используете? Я не могу воссоздать это поведение. Также значение '2' в первом столбце не имеет никакого смысла. Для адреса 32-битной системы требуется 32 бит = 4 байта. – Zeta

+0

Я использую компилятор Borland C++ 5.02. Я создал приложение консоли DOS.Я не знаю, как скопировать результаты из черного окна консоли и поместить их сюда. – quantum231

0

Я думаю, что происходит то, что вы приближаетесь к (16-разрядным) указателям на локальные переменные, но указатель, объявленный как тип *, является дальним (32-разрядным) указателем.

Это причуда работы с 16-разрядным процессором Intel (или 32-разрядным процессором в реальном режиме), например. в DOS, где у вас есть доступ только к 1 МБ памяти (или 640 кБ на практике). Верхние 16 бит дальнего указателя представляют собой сегмент (64-разрядная страница в памяти), а нижние 16 бит - смещение.

http://en.wikipedia.org/wiki/Real_mode

http://wiki.answers.com/Q/What_are_near_far_and_huge_pointers_in_C

не отвечающими в состоянии воспроизвести это, скорее всего, с использованием операционной системы 32-бит (или больше) на 32-бит (или более) процессора.

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