今天遇到乙個詭異的記憶體被踩的問題,後來發現是乙個全域性變數與另乙個靜態庫中的全域性變數重名了,
a.c:
#include
int g_ctx =0;
int g_overlap =0;
inta_store_data
(int n)
inta_read_data()
b.c:
#include
typedef
struct
b_s;
b_s g_ctx;
intb_store_data
(int a,
int b,
int c)
intb_read_data()
main.c:
#include
intmain()
在a.c和b.c中都定義了全域性變數g_ctx,反彙編後可以看到:
disassembly of section .dynsym:
...skipping...
00021044 :
21044: 00000000 andeq r0, r0, r0
00021048 :
21048: 00000000 andeq r0, r0, r0
資料段中g_ctx中分配了4個位元組,因此在b.c中訪問g_ctx時會導致踩記憶體
因此全域性變數盡量都用static進行修飾,加上static 後資料段如下:
disassembly of section .dynsym:
...skipping...
21028: 00000000 andeq r0, r0, r0
0002102c :
...00021044 :
21044: 00000000 andeq r0, r0, r0
00021048 :
21048: 00000000 andeq r0, r0, r0
0002104c :
...
可以看到資料段中有兩個g_ctx static全域性變數 全域性變數
1 全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...
全域性變數和靜態全域性變數
全域性變數和區域性變數是從變數的作用域的角度劃分。靜態變數和動態變數是從變數的記憶體分配的角度劃分。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同,區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原...
c 全域性變數 靜態全域性變數
全域性變數是靜態儲存方式,靜態全域性變數也是靜態儲存方式,這兩者在儲存方式上並無不同。區別 雖在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,靜態全域性變數在各個原始檔中都是有效的。靜態區域性變數則限制了其作用域,只在定義該變數的原始檔內有效,在同一源程式的其它原始檔中不能...