Lecture08: Static Variable, Memory Model, Top-Down Program Development 4/22/2013

advertisement
Lecture08: Static Variable,
Memory Model, Top-Down
Program Development
4/22/2013
1
Outline
•
•
•
•
Midterm results
Static variables
Memory model
Program development
2
Midterm results
• Good job – most of you have done well.
• Avg: 84.68
• Std: 36
3
Static Local Variables
A permanent variable inside a function whose value lifetime lasts through the entire
program execution (vs. local variable, its storage is gone at the end of the function)
#include <stdio.h>
void f1()
{
static int k=0;
int j = 10;
printf("value of k=%d j=%d\n", k, j);
k=k+10;
}
void main()
{
int i = 0;
f1();
printf("after first call\n");
f1();
printf("after second call\n");
f1();
printf("after third call\n");
}
4
Exercise 8-1
Complete the following function sumit() that reads an integer from the user,
computes an accumulative sum, and print it out.
void sumit()
{
static int sum = 0;
..int num;
printf("\nEnter a number: ");
..scanf("%d", &num);
..sum+=num;
printf("The current sum is: %d", sum);
}
int main()
{
int i =0;
printf("Enter 5 numbers to be summed\n");
for(i = 0; i<5; ++i)
sumit();
printf("Program completed\n");
return 0;
}
5
C Memory Model – where are variables &
program code stored in the computer memory?
• Program code
• Function variables
– Arguments
– Local variables
– Return location
• Global Variables
– Statically allocated
– Dynamically allocated
int fact (int n)
{
return(n*fact(n-1));
}
void main() { … fact(5); …}
6
The Stack
• Stores
–
–
–
–
Function local variables
Temporary variables
Arguments for next function call
Where to return when function ends
7
The Stack
• Managed by compiler
–
–
–
–
One stack frame each time function called
Created when function called
Stacked on top (under) one another
Destroyed at function exit
8
What can go wrong?
• Recall that local variables are stored on the stack
• Memory for local variables is deallocated when function
returns
• Returning a pointer to a local variable is almost always a bug!
char *my_strcat(char *s1, char *s2)
{
char s3[1024];
strcpy(s3, s1);
strcat(s3, s2);
return s3;
}
9
What Can Go Wrong?
• Run out of stack space
• Unintentionally change values on the stack
– In some other function's frame
– Even return address from function
• Access memory even after frame is deallocated
10
The Heap
• C can use space in another part of memory: the heap
– The heap is separate from the execution stack
– Heap regions are not deallocated when a function returns
• The programmer requests storage space on the heap
– C never puts variables on the heap automatically
– But local variables might point to locations on the heap
– Heap space must be explicitly allocated and deallocated by the
programmer
11
malloc()
• Library function in <stdlib.h>
– Stands for memory allocate
• Requests a memory region of a specied size
– Syntax: void *malloc(int size)
– void * is generic pointer type
12
Usage
int main()
{
int* p1 = (int *) malloc(10 * sizeof(int));
if (p1 == NULL)
{
// do cleanup
}
// do something
free(p1);
return 0;
}
• Good to check the return value from malloc()
• Must explicitly free memory when no longer in use
13
What Can Go Wrong?
•
•
•
•
Run out of heap space: malloc returns 0
Unintentionally change other heap data
Access memory after free'd
free memory twice
14
Multidimensional Array
• On the stack: int a[10][20];
– Initialization: int a[][] = {{1,
– Accessing the array: a[1][0]
2, 3}, {4, 5, 6}};
• On the heap: int **a = (int **) malloc()
– The array size is not known until runtime and stored in a variable x
int **a = (int **) malloc(x * sizeof(int *));
for (int i = 0; i < 10; i++)
{
a[i] = (int *) malloc(20 * sizeof(int));
}
• Don't forget to free them!
15
Exercise 8-2
Write a program that (1) asks for the number of friends, (2) asks for a name,
and (3) checks a series of strings to see which one matches the names of
friends. Please use
• Use malloc() to create this multi-dimensional array to stores friends’
names. Assume that each name is less than 10 characters.
• Use <string.h> library
• Use scanf(“ %s”, ..) to read a name separated by one or more
whitespaces
You can modify from the skeleton code on the next slide.
16
#include <stdio.h>
#include <string.h>
int main()
{
char** friends;
char name[10];
int n, i;
printf("Input the number of your friends: ");
scanf("%d", &n);
/* call malloc() to allocate dynamic memory for friends and friends[1..n-1] */
…
for (;;)
{
printf("Input a name: ");
scanf(" %s", name);
for (i=0; i<n; i++)
{
if (strcmp(friends[i], name) == 0)
{
printf("%s is friend #%d\n", name, i+1);
break;
}
}
if (i == n)
{
printf("%s is not a friend\n", name);
}
}
/* call free() to free memory for friends and friends[1..n-1] */
…
}
17
Program development (important!)
• A Common problem
– Know all C commands but don’t know how to use them to write a
program.
• Top-down approach – always work!
– Start by writing down the main steps (in words/comments, not code) of a
program. Like a paragraph in an essay.
– For each difficult main step, break it down into smaller steps. Again in
words/comments, not code.
– Apply this “divide-and-conquer” approach until the steps are simple
enough to code.
– Write code
18
Last Year’s Midterm Problem 1
19
Top-Down Approach to Program
Development
• Start by writing down the main steps (in words/comments, not code)
of a program. Like a paragraph in an essay.
• For each difficult main step, break it down into smaller steps.
Again in words/comments, not code.
• Apply this “divide-and-conquer” approach until the steps are
simple enough to code.
• Write code
20
21
22
23
24
Top-Down Approach to Program
Development
• Start by writing down the main steps (in words/comments, not code)
of a program. Like a paragraph in an essay.
• For each difficult main step, break it down into smaller steps.
Again in words/comments, not code.
• Apply this “divide-and-conquer” approach until the steps are
simple enough to code.
• Write code
25
26
Top-Down Approach to Program
Development
• Start by writing down the main steps (in words/comments, not code)
of a program. Like a paragraph in an essay.
• For each difficult main step, break it down into smaller steps.
Again in words/comments, not code.
• Apply this “divide-and-conquer” approach until the steps are
simple enough to code.
• Write code
27
28
29
30
31
32
33
34
35
Systematic way of writing programs
• Like writing an essay.
• Start with an outline that describes what you are going to
write.
• Okay to write the comments in Chinese.
36
Exercise 8-3
37
Top-Down Approach to Program
Development
• Start by writing down the main steps (in words/comments, not code)
of a program. Like a paragraph in an essay.
• For each difficult main step, break it down into smaller steps.
Again in words/comments, not code.
• Apply this “divide-and-conquer” approach until the steps are
simple enough to code.
• Write code
38
39
Top-Down Approach to Program
Development
• Start by writing down the main steps (in words/comments, not code)
of a program. Like a paragraph in an essay.
• For each difficult main step, break it down into smaller steps.
Again in words/comments, not code.
• Apply this “divide-and-conquer” approach until the steps are
simple enough to code.
• Write code
40
41
Top-Down Approach to Program
Development
• Start by writing down the main steps (in words/comments, not code)
of a program. Like a paragraph in an essay.
• For each difficult main step, break it down into smaller steps.
Again in words/comments, not code.
• Apply this “divide-and-conquer” approach until the steps are
simple enough to code.
• Write code
42
43
Top-Down Approach to Program
Development
• Start by writing down the main steps (in words/comments, not code)
of a program. Like a paragraph in an essay.
• For each difficult main step, break it down into smaller steps.
Again in words/comments, not code.
• Apply this “divide-and-conquer” approach until the steps are
simple enough to code.
• Write code one step at a time
• Debug each step if necessary
44
45
46
47
48
49
Download