C 兩個cpp呼叫靜態全域性變數與全域性變數問題

2021-09-03 07:12:44 字數 894 閱讀 2969

前提概要:兩個cpp檔案想操作同乙個map物件,第乙個cpp中做插入處理,第二個cpp中做查詢處理。使用全域性變數可以實現,這裡記錄一下使用靜態全域性變數時,為什麼會出錯的問題。

aaa.h

#include #include #include using namespace std;

void f_bbb();

void f_ccc();

static mapm_test;

bbb.cpp

#include #include "aaa.h"

//mapm_test;

void f_bbb()

{ m_test["aaa"] = "aaa";

std::cout<<"bbb:address"<<&m_test#include #include "aaa.h"

//extern mapm_test;

void f_ccc()

{ map::iterator iter;

std::cout<<"ccc:address"<<&m_test#include #include "aaa.h"

int main()

{ f_bbb();

f_ccc();

std::cout<<"finish!"《執行結果:

[root@localhost workplace]# ./test

bbb:address:0x604240

ccc:address:0x6042a0

finish!

原因:標頭檔案中定義的靜態全域性變數在被不同的原始檔引用時,雖然名稱一樣,但編譯時已是不同的靜態變數,占用的記憶體也是不一樣的。所以上面的ccc.cpp未能列印出m_test的結果。

C 靜態全域性變數與普通全域性變數

一 儲存區域 1 棧 由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區域。通常儲存區域性變數,函式引數。2 堆 由new分配的記憶體塊,需要手動釋放。如果程式設計師沒有手動釋放,在程式執行結束後,作業系統自動 3 自由儲存區 由malloc等分配的記憶體塊,與堆相似,用free來釋放。...

c 全域性變數 靜態全域性變數

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

C 全域性變數 靜態全域性變數 靜態區域性變數

全域性變數儲存在靜態儲存區,其作用域是全域性作用域,生命週期是整個程式的生命週期。具體而言,在乙個檔案中定義乙個全域性變數,在程式的其它檔案中可以通過extern關鍵字再次宣告說明該變數已經定義。靜態全域性變數儲存在靜態儲存區,其作用域只能是定義該變數的檔案,生命週期是整個程式的生命週期。靜態區域性...