c programming or fun with pointers tutorial #2 cpsc 261

22
C programming or Fun with pointers Tutorial #2 CPSC 261

Upload: juliana-haynes

Post on 01-Jan-2016

235 views

Category:

Documents


2 download

TRANSCRIPT

C programmingor

Fun with pointers

Tutorial #2CPSC 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;

23

0 1 2 3 4 5 6

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 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

...

Which one is right?

23 0 0 0

0 1 2 3 4 5 6

...

0 0 0 23

0 1 2 3 4 5 6

...

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”)

How to swap bytes?• Go from one endianness to the other?

23 45 19 66

0 1 2 3

66 19 45 23

0 1 2 3

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);

How many bytes get written?

fprintf(f, “%d”, *p); • 1 or more bytes depending on the value of *p

5232123123123

fwrite(p, sizeof(int), 1, f);• Always 4 bytes, why?