/*********************************************************************************************/ //System Variables unistd.h man end(3) /*********************************************************************************************/ #include #include #include #include #include /*********************************************************************************************/ //Global Constants /*********************************************************************************************/ #define SHOW_ADDRESS(ID, I) printf("The id %s \t is at:%8X\n", ID, (unsigned long int)&I); /*********************************************************************************************/ //System Variables unistd.h man end(3) /*********************************************************************************************/ extern int etext, edata, end ; char *Ptr = "String C \n " ; // initialized global char Buff[100] ; // uninitialized global /*********************************************************************************************/ // Function prototype -- PtrFct=function pointer /*********************************************************************************************/ void PtrFct( int LocUninit ) { int LocInit = 1; SHOW_ADDRESS(" LocUninit (inside PtrFct) " , LocUninit ) if(LocUninit > 0) { PtrFct(LocUninit-LocInit); } } /*********************************************************************************************/ //Main /*********************************************************************************************/ int main( int argc, char *argv[ ], char *envp [ ] ) { int i = 0; // local intialized => stack segment static int diff; // static local uninitialized =>data segment static int StackCalls = 5; // static local intialized => data segment int * IntPtr1 = (int *)malloc(10 * sizeof(int)); //heap int * IntPtr2 = (int *)malloc(10 * sizeof(int)); //heap strcpy (Buff, " Layout of virtual memory \n "); write(1, Buff, strlen(Buff)+1) ; printf("Adr etext : %8X \t Adr edata : %8X \t Adr end : %8X \n\n" , ( unsigned long int )&etext, ( unsigned long int ) &edata, ( unsigned long int ) &end ); printf (" Variable \t HEX_ADDR " ) ; SHOW_ADDRESS(" main " , main ) ; SHOW_ADDRESS(" PtrFct ", PtrFct) ; SHOW_ADDRESS(" etext " , etext ) ; diff = ( unsigned long int ) &PtrFct - ( unsigned long int ) &main; printf(" PtrFct is %d bytes above main\n", diff ); SHOW_ADDRESS(" Global Ptr ", Ptr ) ; diff = ( unsigned long int ) &Ptr - ( unsigned long int ) &PtrFct; printf(" Ptr is %d bytes above PtrFct \n" , diff ) ; SHOW_ADDRESS(" Global Buff" , Buff) ; printf(" IntPtr1 %8X\n" , ( unsigned long int )IntPtr1) ; printf(" IntPtr2 %8X\n" , ( unsigned long int )IntPtr2) ; SHOW_ADDRESS(" diff " , diff ) ; SHOW_ADDRESS(" stack calls" , StackCalls ) ; SHOW_ADDRESS(" edata " , edata ) ; SHOW_ADDRESS(" end " , end ) ; SHOW_ADDRESS(" argc " , argc ) ; SHOW_ADDRESS(" argv " , argv ) ; SHOW_ADDRESS(" i " , i ) ; PtrFct ( StackCalls ) ; return 0 ; }