關於struct的初始化

在對struct 類型的使用時,要注意對其進行初始化,特別是其中的指針類型。

因爲在對已定義的struct的函數調用當中,會出現對它的進行非空判斷後釋放內存的危險行爲。

 

 


 

 

 

如下例:

 

gcc編譯後的執行結果爲:

 

sea@sea-server:~/testcode$ ./a.out
Try free!!!
*** glibc detected *** ./a.out: free(): invalid pointer: 0xb7f63ff4 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7e84a85]
/lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb7e884f0]
./a.out[0x8048443]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7e2f450]
./a.out[0x80483b1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:01 2105525    /home/sea/testcode/a.out
08049000-0804a000 rw-p 00000000 08:01 2105525    /home/sea/testcode/a.out
0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]
b7e18000-b7e19000 rw-p b7e18000 00:00 0
b7e19000-b7f62000 r-xp 00000000 08:01 4383783    /lib/tls/i686/cmov/libc-2.7.so
b7f62000-b7f63000 r--p 00149000 08:01 4383783    /lib/tls/i686/cmov/libc-2.7.so
b7f63000-b7f65000 rw-p 0014a000 08:01 4383783    /lib/tls/i686/cmov/libc-2.7.so
b7f65000-b7f68000 rw-p b7f65000 00:00 0
b7f69000-b7f73000 r-xp 00000000 08:01 4366357    /lib/libgcc_s.so.1
b7f73000-b7f74000 rw-p 0000a000 08:01 4366357    /lib/libgcc_s.so.1
b7f74000-b7f77000 rw-p b7f74000 00:00 0
b7f77000-b7f78000 r-xp b7f77000 00:00 0          [vdso]
b7f78000-b7f92000 r-xp 00000000 08:01 4366348    /lib/ld-2.7.so
b7f92000-b7f94000 rw-p 00019000 08:01 4366348    /lib/ld-2.7.so
bfdb2000-bfdc7000 rw-p bffeb000 00:00 0          [stack]
Aborted

對這種錯誤,唯有在定義struct的時候,進行細緻的初始化:

sConfig.category = sConfig.name = sConfig.element = sConfig.type = sConfig.value = NULL;

發佈了45 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章