I was playing around with C to try to discover how it assigns memory, so I wrote this: int test1; int test2; char test3; int* ptr=malloc(3*sizeof(int)); printf("address of dynamic memory: %p", ptr); printf("address of a pointer: %p", &ptr); printf("address of an integer: %p", &test1); printf("address of another integer: %p", &test2); printf("address of a char: %p", &test3); and it outputed: address of dynamic memory: 0x84ea008 address of a pointer: 0xbfc5bf98 address of an integer: 0xbfc5bf94 address of another integer: 0xbfc5f90 address of a char: 0xbfc5bf9f All addresses are 8 digits long except the address of the dynamically allocated memory. I know you have to add a 0, but is it 0x084ea008 or 0x84ea0080? Is the dynamically allocated memory in the stack space? I heard that Linux stored the stack at 0xFFFFFFFF, and that it grew downward, so why isn't the dynamically allocated memory at 0xFFFFFFFF? Second, I notice that the separation between the address of a pointer and a char is 8 bytes, as 0xbfc5bf98 is smaller than 0xbfc5bf9f by 8 bytes. I even took out the pointer, and just had a program with chars and ints, and noticed that the separation between a char and an int is 8 bytes. Does Linux separate data types by 8 bytes: int1, int2, int3, int4, int5 --- 8 bytes --- char1, char2, char3, char4 Separation between chars is 1 byte, and separation between ints is 4 bytes, but I don't know where 8 bytes comes from at the separation between a char and an int. Is there a way I can see what address the code is stored in? The file type is ELF, and I assume what address the code is stored in is specified by the ELF structure, but every time I try to read an ELF file, Linux tells me it's not a text file so I can't read it. Does Linux use a 2-tier page table for memory management? I'm a little confused about having code segments, data segments, stack and shared segments if the memory system is a 2-tier page table rather than a segment/page combo. And things like the shared segment: do you only see something stored in that segment if you create multithreaded programs, using the functions in some of the system call libraries?