全域性變數同名導致踩記憶體

2021-10-07 05:27:52 字數 1192 閱讀 1241

今天遇到乙個詭異的記憶體被踩的問題,後來發現是乙個全域性變數與另乙個靜態庫中的全域性變數重名了,

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 全域性變數 靜態全域性變數

全域性變數是靜態儲存方式,靜態全域性變數也是靜態儲存方式,這兩者在儲存方式上並無不同。區別 雖在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,靜態全域性變數在各個原始檔中都是有效的。靜態區域性變數則限制了其作用域,只在定義該變數的原始檔內有效,在同一源程式的其它原始檔中不能...