Advanced C programming CAS CS210 Ying Ye Boston University

advertisement
Advanced C programming
CAS CS210
Ying Ye
Boston University
Outline
 C pointer
 GDB debugger
C pointer
 Normal variable: int i = 3;
3 values related with i:
 size in memory: 4
 address in memory: e.g. 100 (can be assigned other address)
 value stored in this address: 3
0
100
104
3
memor
y
i == ?
i == 3
C pointer
 Pointer: int *p;
 It is a variable in memory
 It stores address of other variable
e.g. p = &i; &: take the address of the variable
Assume the address of i is 100, address of p is 50
On 32-bit machine, size of i and p: 4 and 4
0
memory
p == ?
*p == ?
50
54
100
100
104
3
p == 100
*: get the value of variable
pointed by the pointer
*p == 3
C pointer
 Basic operations on pointer:
 assign value to pointer: p = 120;
0
50
54
120
memor
y
100
104
120
124
3
 assign value to the normal variable pointed by p: *p = 120;
0
memor
y
50
54
100
100
104
120
C pointer
 Practice:
create a C file: vim pointer.c
void add(int *x, int *y)
{
*x += *y;
}
int main(void)
{
int a = 1, b = 2;
add(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
C pointer
 Compile:
gcc -o pointer pointer.c
 Run:
./pointer
GDB
 wget http://cs-people.bu.edu/yingy/gdbtest.c
 vim gdbtest.c
 gcc -o gdbtest -ggdb gdbtest.c
 ./gdbtest
GDB
 Use GDB to debug it:
 gdb gdbtest
 run
 Set breakpoint:
 break 8
Breakpoint: an intentional stopping in a program, put in place
for debugging purposes. Program pauses when it reaches
breakpoint.
GDB
int main(void)
{
int a[5] = {1, 2, 3, 4, 5}, b = 0;
int i;
for(i = 0; i <= 5; i++)
b += a[i];
printf("b = %d\n", b);
return 0;
}
GDB
 Checking variables:
①run
②print i
③print b
④continue
⑤(jump to  and repeat commands until you see i == 5)
GDB
 Bug:
 i == 5!
 b += a[5]!
 only have a[0], a[1], a[2], a[3], a[4], no a[5]!
 Quit GDB: quit
 Fix: for(i = 0; i < 5; i++)
 Save, compile and run:
 gcc -o gdbtest -ggdb gdbtest.c
 ./gdbtest
Download