C/Pointers
From Attie's Wiki
(Difference between revisions)
m |
m |
||
Line 1: | Line 1: | ||
A helper for people starting out with pointers: | A helper for people starting out with pointers: | ||
+ | |||
+ | ==test.c== | ||
<source lang="c"> | <source lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
Line 40: | Line 42: | ||
</source> | </source> | ||
− | Output | + | ==Output== |
<source lang="text"> | <source lang="text"> | ||
$ gcc test.c -o test && ./test | $ gcc test.c -o test && ./test | ||
Line 63: | Line 65: | ||
(*p): 0x8048736 <-- the address of the 'a' | (*p): 0x8048736 <-- the address of the 'a' | ||
</source> | </source> | ||
+ | |||
+ | ==Memory Map== | ||
+ | {| | ||
+ | | ... || ... || ... || ... | ||
+ | |- | ||
+ | | 0xBF893E93 |style="color:red"| 0x08 || || INVALID (MSB) || This will probably be different when you run the program | ||
+ | |- | ||
+ | | 0xBF893E92 || 0x04 || || INVALID || This will probably be different when you run the program | ||
+ | |- | ||
+ | | 0xBF893E91 || 0x86 || || INVALID || This will probably be different when you run the program | ||
+ | |- | ||
+ | | 0xBF893E90 || 0x80 || || INVALID (LSB) || This will probably be different when you run the program | ||
+ | |- | ||
+ | | 0xBF893E8F || 0x08 || || s (MSB) || | ||
+ | |- | ||
+ | | 0xBF893E8E || 0x04 || || s || | ||
+ | |- | ||
+ | | 0xBF893E8D || 0x87 || || s || | ||
+ | |- | ||
+ | | 0xBF893E8C || 0x34 || || s (LSB) || | ||
+ | |- | ||
+ | | 0xBF893E8B || 0xBF || || p (MSB) || | ||
+ | |- | ||
+ | | 0xBF893E8A || 0x89 || || p || | ||
+ | |- | ||
+ | | 0xBF893E89 || 0x3E || || p || | ||
+ | |- | ||
+ | | 0xBF893E88 || 0x8C || || p (LSB) || | ||
+ | |- | ||
+ | | ... || ... || ... || ... || | ||
+ | |- | ||
+ | | 0x08048737 || 0x00 || '\0' || || | ||
+ | |- | ||
+ | | 0x08048736 || 0x63 || 'a' || || | ||
+ | |- | ||
+ | | 0x08048735 || 0x62 || 'b' || || | ||
+ | |- | ||
+ | | 0x08048734 || 0x63 || 'c' || || | ||
+ | |- | ||
+ | | ... || ... || ... || ... || | ||
+ | |- | ||
+ | | 0x08048680 || 0x55 || || || This will probably be different when you run the program | ||
+ | |} |
Revision as of 23:44, 8 March 2012
A helper for people starting out with pointers:
test.c
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #define P(expr) printf("%10s: 0x%02X\n", #expr, expr) int main(void) { char *s = "cba"; char **p = &s; P( s ); P( &s ); P( s[0] ); P( *s ); P( p ); P( &p ); P( p[0] ); P( *p ); P( p[1] ); P( *p[1] ); P( (*p)[1] ); P( *(p[1]) ); P( (*p) ); P( (*p)++ ); P( (*p)[0] ); P( (*p) ); P( ++(*p) ); P( (*p)[0] ); P( (*p) ); return 0; }
Output
$ gcc test.c -o test && ./test s: 0x8048734 <-- the address of the 'c' &s: 0xBF893E8C <-- the address of the variable s s[0]: 0x63 <-- the 'c' *s: 0x63 <-- the 'c' p: 0xBF893E8C <-- the address of the variable s &p: 0xBF893E88 <-- the address of the variable p p[0]: 0x8048734 <-- the address of the 'c' *p: 0x8048734 <-- the address of the 'c' p[1]: 0x8048680 <-- INVALID - the value stored just after the variable p (the program may segfault here) *p[1]: 0x55 <-- INVALID - the value stored at location 0x8048680 (again, the program may segfault here) (*p)[1]: 0x62 <-- the 'b' *(p[1]): 0x55 <-- INVALID - the same as *p[1] (*p): 0x8048734 <-- the address of the 'c' (*p)++: 0x8048734 <-- the address of the 'c' - the pointer is POST incremented (*p)[0]: 0x62 <-- the 'b' (*p): 0x8048735 <-- the address of the 'b' ++(*p): 0x8048736 <-- the address of the 'a' - the pointer is PRE incremented (*p)[0]: 0x61 <-- the 'a' (*p): 0x8048736 <-- the address of the 'a'
Memory Map
... | ... | ... | ... | |
style="color:red"| 0x08 | INVALID (MSB) | This will probably be different when you run the program | ||
0xBF893E92 | 0x04 | INVALID | This will probably be different when you run the program | |
0xBF893E91 | 0x86 | INVALID | This will probably be different when you run the program | |
0xBF893E90 | 0x80 | INVALID (LSB) | This will probably be different when you run the program | |
0xBF893E8F | 0x08 | s (MSB) | ||
0xBF893E8E | 0x04 | s | ||
0xBF893E8D | 0x87 | s | ||
0xBF893E8C | 0x34 | s (LSB) | ||
0xBF893E8B | 0xBF | p (MSB) | ||
0xBF893E8A | 0x89 | p | ||
0xBF893E89 | 0x3E | p | ||
0xBF893E88 | 0x8C | p (LSB) | ||
... | ... | ... | ... | |
0x08048737 | 0x00 | '\0' | ||
0x08048736 | 0x63 | 'a' | ||
0x08048735 | 0x62 | 'b' | ||
0x08048734 | 0x63 | 'c' | ||
... | ... | ... | ... | |
0x08048680 | 0x55 | This will probably be different when you run the program |