CS 61C L04 C Pointers (1) Wawrzynek Spring 2006 © UCB1/25/2006John Wawrzynek(www.cs.berkeley.edu/~johnw)www-inst.eecs.berkeley.edu/~cs61c/CS61C – Machine StructuresLecture 4 – C Pointers and ArraysCS 61C L04 C Pointers (2) Wawrzynek Spring 2006 © UCBCommon C Error°There is a difference betweenassignment and equality•a = b is assignment•a == b is an equality test°This is one of the most commonerrors for beginning C programmers!CS 61C L04 C Pointers (3) Wawrzynek Spring 2006 © UCBPointers & Allocation (1/2)°After declaring a pointer:int *ptr;ptr doesn’t actually point to anythingyet (well actually points somewhere -but don’t know where!). We caneither:• make it point to something that alreadyexists, or• allocate room in memory for somethingnew that it will point to… (next time)CS 61C L04 C Pointers (4) Wawrzynek Spring 2006 © UCBPointers & Allocation (2/2)°Pointing to something that alreadyexists:int *ptr, var1, var2;var1 = 5;ptr = &var1;var2 = *ptr;°var1 and var2 have room implicitlyallocated for them.ptr var1?var2?5 5?CS 61C L04 C Pointers (5) Wawrzynek Spring 2006 © UCBMore C Pointer Dangers°Declaring a pointer just allocatesspace to hold the pointer – it does notallocate something to be pointed to!°Local variables in C are not initialized,they may contain anything.°What does the following code do?void f(){ int *ptr; *ptr = 5;}CS 61C L04 C Pointers (6) Wawrzynek Spring 2006 © UCBPointers in C°Why use pointers?• If we want to pass a huge struct or array,it’s easier to pass a pointer than thewhole thing.• In general, pointers allow cleaner, morecompact code.°So what are the drawbacks?• Pointers are probably the single largestsource of bugs in software, so be carefulanytime you deal with them.CS 61C L04 C Pointers (7) Wawrzynek Spring 2006 © UCBArrays (1/6)°Declaration:int ar[2];declares a 2-element integer array. Anarray is really just a block of memory. int ar[] = {795, 635};declares and fills a 2-elt integer array.°Accessing elements:ar[num];returns the numth element.CS 61C L04 C Pointers (8) Wawrzynek Spring 2006 © UCBArrays (2/6)°Arrays are (almost) identical topointerschar *string and char string[] arenearly identical declarationsThey differ in very subtle ways:incrementing, declaration of filled arrays°Key Concept: An array variable is a“pointer” to the first element.CS 61C L04 C Pointers (9) Wawrzynek Spring 2006 © UCBArrays (3/6)°Consequences: int ar[10];ar is an array variable but looks like apointer in many respects (though not all)ar[0] is the same as *arar[2] is the same as *(ar+2)We can use pointer arithmetic to accessarrays more conveniently.°Declared arrays are only allocatedwhile the scope is validchar *foo() { char string[32]; ...; return string;} is incorrectCS 61C L04 C Pointers (10) Wawrzynek Spring 2006 © UCBArrays (4/6)°Array size n; want to access from 0 ton-1, can test for exit by comparing toaddress one element past the array int ar[10], *p, *q, sum = 0;...p = &ar[0]; q = &ar[10];while (p != q) /* sum = sum + *p; p = p + 1; */sum += *p++;• Is this legal?°C defines that one element past end ofarray must be a valid address, i.e., notcause an bus error or address errorCS 61C L04 C Pointers (11) Wawrzynek Spring 2006 © UCBArrays (5/6)°Array size n; want to access from 0 ton-1, so you should use counter ANDutilize a constant for declaration & incr• Wrong styleint i, ar[10];for(i = 0; i < 10; i++){ ... }• Right style#define ARRAY_SIZE 10int i, a[ARRAY_SIZE];for(i = 0; i < ARRAY_SIZE; i++){ ... }°Why? SINGLE SOURCE OF TRUTH• You’re avoiding maintaining two copiesof the number 10CS 61C L04 C Pointers (12) Wawrzynek Spring 2006 © UCBArrays (6/6)°Pitfall: An array in C does not know itsown length, & bounds not checked!• Consequence: We can accidentallyaccess off the end of an array.• Consequence: We must pass the arrayand its size to a procedure which isgoing to traverse it.°Segmentation faults and bus errors:• These are VERY difficult to find;be careful! (You’ll learn how to debugthese in lab…)CS 61C L04 C Pointers (13) Wawrzynek Spring 2006 © UCBSegmentation Fault vs Bus Error?°http://www.hyperdictionary.com/° Segmentation Fault• A fatal failure in the execution of a machinelanguage instruction resulting from theprocessor detecting an anomalous condition onits bus. Such conditions include invalid addressalignment (accessing a multi-byte number at anodd address), accessing a physical address thatdoes not correspond to any device, or someother device-specific hardware error. A buserror triggers a processor-level exception whichUnix translates into a “SIGBUS” signal which, ifnot caught, will terminate the current process.° Bus Error• An error in which a running Unix programattempts to access memory not allocated to itand terminates with a segmentation violationerror and usually a core dump.CS 61C L04 C Pointers (14) Wawrzynek Spring 2006 © UCBPointer Arithmetic (1/3)°Since a pointer is just a mem address, wecan add to it to traverse an array.p+1 returns a ptr to the next array elt.(*p)+1 vs *p++ vs *(p+1) vs (*p)++ ?x = *p++ ⇒ x = *p ; p = p + 1;x = (*p)++ ⇒ x = *p ; *p = *p + 1;°What if we have an array of large structs(objects)?C takes care of it: In reality, p+1 doesn’t add1 to the memory address, it adds the size ofthe array element.CS 61C L04 C Pointers (15) Wawrzynek Spring 2006 © UCBPointer Arithmetic (2/3)°So what’s valid pointer arithmetic?• Add an integer to a pointer.• Subtract 2 pointers (in the same array).• Compare pointers (<, <=, ==, !=, >, >=)• Compare pointer to NULL (indicates thatthe pointer points to nothing).°Everything else is illegal since itmakes no sense:• adding two pointers• multiplying pointers• subtract pointer from integerCS 61C L04 C Pointers (16) Wawrzynek Spring 2006 © UCBint get(int array[], int n){ return (array[n]);/* OR */ return *(array + n);}Pointer Arithmetic (3/3)°C knows the size of the thing a pointerpoints to – every addition orsubtraction moves that many bytes.°So the following are equivalent:CS 61C L04 C Pointers (17) Wawrzynek Spring 2006 © UCBC Strings°A string in C is an array of characters.char string[] = "abc";°How do you tell how long a string is?• Last character is followed by a 0 byte(null terminator)int strlen(char s[]){ int n = 0; while (s[n] != 0) n++; return n;}CS 61C L04 C Pointers (18) Wawrzynek Spring 2006 © UCBC Strings Headaches°One
View Full Document