gdb调试字符串交换
- C/C++ code
1 #include <stdio.h>2 char * fan( char *p, int len );3 int main()4 {5 char* p = "123";6 p = fan(p, 3);7 printf( "%s", p );8 return 0;9 }10 char * fan( char *p, int len )(gdb) 11 { 12 char temp; 13 char * n1 = p; 14 char * n2 = p+len-1; 15 while( n1 != n2) 16 { 17 temp = *n1; 18 *n1 = *n2; 19 *n2 = temp; 20 n1++; (gdb) 21 n2--; 22 } 23 return p; 24 } (gdb) b fan Breakpoint 1 at 0x400544: file shiyan.c, line 13. (gdb) run Starting program: /home/sam/oj/shi Breakpoint 1, fan (p=0x40068c "123", len=3) at shiyan.c:13 13 char * n1 = p; (gdb) p *n1 $1 = 72 'H' (gdb) n14 char * n2 = p+len-1;(gdb) p *n2Cannot access memory at address 0xf0b2dd(gdb) p len$2 = 3(gdb) p temp$3 = 0 '\000'(gdb) n15 while( n1 != n2)(gdb) n17 temp = *n1;(gdb) p temp$4 = 0 '\000'(gdb) n18 *n1 = *n2;(gdb) nProgram received signal SIGSEGV, Segmentation fault.0x0000000000400574 in fan (p=0x40068c "123", len=3) at shiyan.c:1818 *n1 = *n2;(gdb) p temp$5 = 49 '1'(gdb) nProgram terminated with signal SIGSEGV, Segmentation fault.The program no longer exists.(gdb)
[解决办法]
char* p = "123";
这里的p指向的空间是只读的,因为不能修改,会出错的
改为:char p[] = "123";
[解决办法]
同意2楼的解决方法,但不同意3楼的解释,即使楼主代码正确,那样去执行gdb,也会显示Cannot access memory。
gdb中执行n,实际是执行一步,同时显示的是下一步将要执行的代码。
char * n2 = p+len-1;这句没执行时,n2的值是任意的,所以才会出现Cannot access memory at address 0xf0b2dd
p=0x40068c,那么p+len-1就是0x40068e,而不应该是0xf0b2dd
真正出错的在这里(显示18行将要执行*n1 = *n2,输入n开始执行,结果发生段错误):
- C/C++ code
18 *n1 = *n2;(gdb) nProgram received signal SIGSEGV, Segmentation fault.0x0000000000400574 in fan (p=0x40068c "123", len=3) at shiyan.c:18