Memory of a C program
• What does a C program need memory for?– Code– Static data– Dynamic data (heap)– Dynamic data (stack)– Libraries (dynamically linked)
A simple memory model
• Memory manipulated by a C program is just a bunch of bytes
• They start at some address (0?)• And end at some other address (2^64 - 1?)
...
Char pointers• Variables with type char * fit this model nicely
char *p; p = (char *) 0;
0 1 2 3 4 5 6
p
...
Char pointers• Using the pointer accesses one byte
char *p; p = (char *) 0; *p = 23;
23
0 1 2 3 4 5 6
p
...
Other pointers• Other pointer types don’t fit quite so nicely
int *p; p = (int *) 0; How big is *p?
0 1 2 3 4 5 6
p
...
Pointer rules
• The value in a pointer is the smallest address of all the bytes accessed through the pointer
int *p = (int *) 0;• The bytes accessed are 0, 1, 2, and 3 (ints are
4 bytes)long *p = (long *) 0;• The bytes accessed are 0, 1, 2, 3, 4, 5, 6, and 7
(longs are 8 bytes)
Other pointers• Using the pointer – first try
int *p; p = (int *) 0; *p = 23;
0 0 0 23
0 1 2 3 4 5 6
p
...
Other pointers• Using the pointer – second try
int *p; p = (int *) 0; *p = 23;
23 0 0 0
0 1 2 3 4 5 6
p
...
Unfortunately, both!!
• Endian-ness– In a little-endian computer, the least-significant
byte of a multi-byte quantity is stored in the byte with the smallest address
– In a big-endian computer, the most-significant byte of a multi-byte quantity is stored in the byte with the smallest address
Other pointers• Using the pointer – big-endian
int *p; p = (int *) 0; *p = 23;
0 0 0 23
0 1 2 3 4 5 6
p
...
Other pointers• Using the pointer – little-endian
int *p; p = (int *) 0; *p = 23;
23 0 0 0
0 1 2 3 4 5 6
p
...
X86 (and X86_64) is little-endian
• The “standard” order for data communicated between computers is big-endian (also called “network byte order”)
Reading data
• For character data:int *p = ...; // Some valid initializationfscanf(f, “%d”, p);
• For binary datafread(p, sizeof(int), 1, f);
How many bytes get read?
fscanf(f, “%d”, p);• 1 or more byte depending on the input
5232123123123
fread(p, sizeof(int), 1, f);• Always 4 bytes, why?
Writing data
• For character data:int *p = ...; // Some valid initializationfprintf(f, “%d”, *p); // Note the *
• For binary datafwrite(p, sizeof(int), 1, f);
Top Related