Skip to main content

Dive Into Systems: Exercises

Section 2.2 C Pointer Variables

Checkpoint 2.2.1. Matching Problem, Dates.

Checkpoint 2.2.2. Multiple Choice(True and False).

    Which of these are good reasons to use a pointer variable? Select all that are true.
  • When you want to hold a normal int
  • When you want to dynamically allocate memory
  • When you want to make a fixed-size array of size 10
  • When you want to make a linked dynamic data structure
  • When you want to pass a large data structure to a function
  • When you want to pass a parameter to a function that that function can change
  • When you want to hold a floating point number
Hint.
What is the unique feature of using pointer instead of value? Do we need these features in the scenarios above?

Checkpoint 2.2.3. Reading/Tracing Code with Pointers.

Given the following code, what does it print to the screen when executed?
a = 3;
ptr = &a;
*ptr = 7;
printf("%d\n", *ptr);
//draw what memory looks like here.
Trace through its execution and draw a picture of memory after its execution.
Answer.
Here is a picture showing the result of the above pointer operatons. Variable a’s initial value is 3, while ptr contains the address of a. Dereferencing ptr and setting its associated value to 7 thus updates the value of a to 7.

Checkpoint 2.2.4. Multiple Choice (True and False).

    What does the following code print to the screen when executed?
    int x, y, *ptr, z;
    ptr = NULL;
    x  = 10;
    y = 20;
    z = 30;
    
    printf("%d\n", *ptr);
    ptr = &x;
    
  • Segfault / Crash (Probably)
  • 10
  • 20
  • 30
  • 0
Hint.
What happens when you dereference a NULL pointer?

Checkpoint 2.2.5. Fill-In the Blank.

What does the following code print to the screen when executed?
int a, b, *ptr2;

a = 5;
b = 6;
ptr2 = &b;
b = 10;

printf("%d", *ptr2);

Checkpoint 2.2.6. Pointers, Multiple Choice.

    Given the following code:
    void f1(void) {
      int x, y, *ptr1, *ptr2;
      x = 2;
      y = 10;
      ptr1 = &x;
      ptr2 = ptr1;
      *ptr1 = 6;
      ptr1 = &y;
      printf("*ptr1=%d *ptr2=%d\n", *ptr1, *ptr2);
    }
    
    What does the function f1() print?
  • *ptr1=10 *ptr2=6
  • Correct! Good job!
  • *ptr1=&x *ptr2=&y
  • The printf statement dereferences the values.
  • *ptr1=2 *ptr2=10
  • Emm...please think about it again.
  • *ptr1=6 *ptr2=10
  • Emm...please think about it again.
  • *ptr1=2 *ptr2=2
  • Emm...please think about it again.
  • *ptr1=10 *ptr2=10
  • Emm...please think about it again.
  • *ptr1=6 *ptr2=6
  • Emm...please think about it again.
  • segfault (program crashes with a segfault)
  • This code actually produces output!
  • compile error
  • This code actually compiles!
Hint.
Trace the values in memory for the variables with arrows and boxes.

Checkpoint 2.2.7. Parsons problem.

Reorder the lines of code below to make a program that swaps the values pointed to by the integer pointers ptr1 and ptr2 (int *ptr1, *ptr2). There is also an integer x (int x).
Assume the follwoing variable declaration and initialized code:
int x, y, temp;	
int *ptr1, *ptr2;

x = 6;
y = 7;
ptr1 = &x;
ptr2 = &y;