220 likes | 441 Views
C programming or Fun with pointers. Tutorial #2 CPSC 261. 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). Memory of a C program. How is this memory laid out?. A simple memory model.
E N D
C programmingorFun with pointers Tutorial #2 CPSC 261
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)
Memory of a C program • How is this memory laid out?
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; 0 1 2 3 4 5 6 23 ... p
Char pointers • Incrementing the pointer works char *p; p = (char *) 0; p++; 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
Other pointers • Incrementing the pointer int *p; p = (int *) 0; 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 1 2 3 4 5 6 0 0 0 23 ... p
Other pointers • Using the pointer – second try int *p; p = (int *) 0; *p = 23; 0 1 2 3 4 5 6 23 0 0 0 ... p
Which one is right? 0 1 2 3 4 5 6 23 0 0 0 ... 0 1 2 3 4 5 6 0 0 0 23 ...
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 1 2 3 4 5 6 0 0 0 23 ... p
Other pointers • Using the pointer – little-endian int *p; p = (int *) 0; *p = 23; 0 1 2 3 4 5 6 23 0 0 0 ... p
X86 (and X86_64) is little-endian • The “standard” order for data communicated between computers is big-endian (also called “network byte order”)
How to swap bytes? • Go from one endianness to the other? 0 1 2 3 23 45 19 66 0 1 2 3 66 19 45 23
Reading data • For character data: int *p = ...; // Some valid initialization fscanf(f, “%d”, p); • For binary data fread(p, sizeof(int), 1, f);
How many bytes get read? fscanf(f, “%d”, p); • 1 or more byte depending on the input 5 23 2123123123 fread(p, sizeof(int), 1, f); • Always 4 bytes, why?
Writing data • For character data: int *p = ...; // Some valid initialization fprintf(f, “%d”, *p); // Note the * • For binary data fwrite(p, sizeof(int), 1, f);
How many bytes get written? fprintf(f, “%d”, *p); • 1 or more bytes depending on the value of *p 5 23 2123123123 fwrite(p, sizeof(int), 1, f); • Always 4 bytes, why?