先看代码(a.c):
- #include <stdio.h>
- int main(int argc, char* argv[])
- {
- int a[4]={1,2,3,4};
- int *ptr1=(int*)(&a+1);
- int *ptr2=(int*)((int)a+1);
- int *ptr3=(int*)(a+1);
- printf("a = %x, &a = %x, &a+1 = %x, (int)a+1 = %x\n", a, &a, &a+1, (int)a+1);
- printf("ptr1 = %x, ptr2 = %x, ptr3 = %x, &ptr1[-1] = %x\n", ptr1, ptr2, ptr3, &ptr1[-1]);
- printf("ptr1[-1] = %x, *ptr2 = %x, *ptr3 = %x\n",ptr1[-1],*ptr2, *ptr3);
- return 0;
- }
再看调试情况:
- [zcm@t #81]$make clean
- rm -f *.o a
- [zcm@t #82]$make
- gcc -g -c -o a.o a.c
- gcc -g -o a a.o
- [zcm@t #83]$gdb a
- GNU gdb (GDB) Fedora (7.0-3.fc12)
- Copyright (C) 2009 Free Software Foundation, Inc.
- License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
- This is free software: you are free to change and redistribute it.
- There is NO WARRANTY, to the extent permitted by law. Type "show copying"
- and "show warranty" for details.
- This GDB was configured as "i686-redhat-linux-gnu".
- For bug reporting instructions, please see:
- <http://www.gnu.org/software/gdb/bugs/>...
- Reading symbols from /mnt/hgfs/Linux_Share/t/a...done.
- (gdb) list
- 1 #include <stdio.h>
- 2
- 3 int main(int argc, char* argv[])
- 4 {
- 5 int a[4]={1,2,3,4};
- 6 int *ptr1=(int*)(&a+1);
- 7 int *ptr2=(int*)((int)a+1);
- 8 int *ptr3=(int*)(a+1);
- 9 printf("a = %x, &a = %x, &a+1 = %x, (int)a+1 = %x\n", a, &a, &a+1, (int)a+1);
- 10 printf("ptr1 = %x, ptr2 = %x, ptr3 = %x, &ptr1[-1] = %x\n", ptr1, ptr2, ptr3, &ptr1[-1]);
- (gdb) list
- 11 printf("ptr1[-1] = %x, *ptr2 = %x, *ptr3 = %x\n",ptr1[-1],*ptr2, *ptr3);
- 12
- 13 return 0;
- 14 }(gdb) b 5
- Breakpoint 1 at 0x80483ce: file a.c, line 5.
- (gdb) b 11
- Breakpoint 2 at 0x8048472: file a.c, line 11.
- (gdb) b 13
- Breakpoint 3 at 0x80484a0: file a.c, line 13.
- (gdb) run
- Starting program: /mnt/hgfs/Linux_Share/t/a
- Breakpoint 1, main (argc=1, argv=0xbffff2f4) at a.c:5
- 5 int a[4]={1,2,3,4};
- Missing separate debuginfos, use: debuginfo-install glibc-2.11-2.i686
- (gdb) c
- Continuing.
- a = bffff214, &a = bffff214, &a+1 = bffff224, (int)a+1 = bffff215
- ptr1 = bffff224, ptr2 = bffff215, ptr3 = bffff218, &ptr1[-1] = bffff220
- Breakpoint 2, main (argc=1, argv=0xbffff2f4) at a.c:11
- 11 printf("ptr1[-1] = %x, *ptr2 = %x, *ptr3 = %x\n",ptr1[-1],*ptr2, *ptr3);
- (gdb) c
- Continuing.
- ptr1[-1] = 4, *ptr2 = 2000000, *ptr3 = 2
- Breakpoint 3, main (argc=1, argv=0xbffff2f4) at a.c:13
- 13 return 0;
- (gdb) x /24xb a
- 0xbffff214: 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00
- 0xbffff21c: 0x03 0x00 0x00 0x00 0x04 0x00 0x00 0x00
- 0xbffff224: 0x24 0xf2 0xff 0xbf 0x15 0xf2 0xff 0xbf
- (gdb)
最后看图解: