2012-04-28 5 views
1

Я протестировал небольшую программу, которая написана ниже. Мой вопрос в том, почему существует разница в 12 байт между указателем на значение и указателем на первый указатель. Но если вы посмотрите на другие адреса указателя есть только разница в 8 байт каждый time.I выполняется эта программа несколько раз, и всегда я вижу это difference.Can кто-нибудь объяснить мне, что может быть причиной заранее спасибо ..Изменение значений адреса указателя

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

int main(void) 
{ 
     int val; 
     int *ptr; 
     int **ptrptr; 
     int ***ptrptrptr; 
     int ****ptrptrptrptr; 
     int *****ptrptrptrptrptr; 

     val=10; 
     ptr=&val; 
     ptrptr=&ptr; 
     ptrptrptr=&ptrptr; 
     ptrptrptrptr=&ptrptrptr; 
     ptrptrptrptrptr=&ptrptrptrptr; 

     printf("Value-%d\n",val); 
     printf("Value address - %d\n",ptr); 
     printf("Pointer address - %d\n",ptrptr); 
     printf("Pointer Pointer Address -%d\n",ptrptrptr); 
     printf("Pointer Pointer Pointer Address -%d\n",ptrptrptrptr); 
     printf("Pointer Pointer Pointer Pointer Address -%d\n",ptrptrptrptrptr); 

     return 0; 
} 

результаты:

Value-10 
Value address - -1308521884 
Pointer address - -1308521896 
Pointer Pointer Address --1308521904 
Pointer Pointer Pointer Address --1308521912 
Pointer Pointer Pointer Pointer Address --1308521920 
+1

Какой компилятор, какой компоновщик, какой процессор? 32 или 64-бит? Что такое int - насколько оно велико? Это действительно имеет значение? Я имею в виду, как вы вообще заметили? –

+1

Интересно, что смена первого int на работу длится так, как вы ожидаете. – strkol

+0

Я работаю хорошо надолго ... :) – Teja

ответ

4

Это всего лишь макет стека, выбранный вашим компилятором, F.E. это может быть связано с выравниванием. Вещи, скорее всего, по-прежнему будут работать с другими макетами.

Обратите внимание, что для печати адресов вы должны использовать %p.

+0

Да% p преобразует int-адрес в hexa..hope. Я прав ... но все равно, почему стек, принимающий адрес так ... – Teja

+0

@Vutukuri Стек макет не закреплен в камне, и он не является стандартным. Каждый компилятор обладает абсолютной свободой в выборе способа расположения локальных переменных. Передача аргументов - это другая история ('cdecl',' stdcall'). – cnicutar

+0

Итак, значит, вы хотите сказать, выполняю ли я ту же программу на компиляторе diff, я могу получить результаты diff? – Teja

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