乙個很有深度的C 記憶體問題 GDB除錯 一

2021-06-05 20:03:13 字數 3195 閱讀 2958

先看**(a.c):

[cpp]

#include 

intmain(

intargc, 

char

* argv)  

;  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;  

}  

再看除錯情況:

[plain]

[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)  

license gplv3+: gnu gpl version 3 or later 

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:  

...  

reading symbols from /mnt/hgfs/linux_share/t/a...done.  

(gdb) list  

1   #include 

2     

3   int main(int argc, char* argv)  

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]=;  

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)   

最後看**:

發現C 使用memset乙個很有趣的問題

使用memset函式的小問題 最近在符習演算法的知識,今天作杭電oj的1114題,乙個揹包問題。最後要求的是可能的硬幣的最小值,所以先把揹包初始化成乙個自定義的極大值inf再進行計算,開始寫的程式如下 include include include using namespace std defin...

很有哲理的乙個故事

兔子跟街上走著,迎面碰上了老狼。老狼伸手就給他一大嘴巴 讓你丫不戴帽子 兔子很鬱悶地回家了,弄一帽子戴著。第二天又碰上老狼了,又挨了一大嘴巴,讓你丫戴帽子 如是幾次,總挨打。兔子想,這麼老挨打不是個事兒啊,不行,我得找老虎投訴去。剛到老虎家門口,就聽老虎在屋裡說話。你也不能老這麼蠻不講理打兔子阿,回...

乙個詭異的C 記憶體洩露問題。

delet被編譯成了兩個步驟 調相應析構函式,p指向的記憶體塊 即使父類沒宣告虛析構函式,第二步還是生效的,所以你derived的記憶體區是被正確 的,但derived的記憶體區域 std string 並不是連續區間,可能是這樣的東東 64byte ptr delet的第二步 的就只是這 64by...