最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

全局變量與局部變量在內(nèi)存中的區(qū)別詳細解析

 更新時間:2013年10月11日 09:59:08   投稿:jingxian  
以下是對全局變量與局部變量在內(nèi)存中的區(qū)別進行了詳細的總結介紹,需要的朋友可以過來參考下,希望對大家有所幫助

一、預備知識—程序的內(nèi)存分配

一個由c/C++編譯的程序占用的內(nèi)存分為以下幾個部分

1、棧區(qū)(stack)— 由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結構中的棧。

2、堆區(qū)(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數(shù)據(jù)結構中的堆是兩回事,分配方式倒是類似于鏈表。

3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域(.data),未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域(.bss)。 - 程序結束后由系統(tǒng)釋放。

4、文字常量區(qū) —常量字符串就是放在這里的(.rodata)。 程序結束后由系統(tǒng)釋放。

5、程序代碼區(qū)—存放函數(shù)體的二進制代碼(.text)。
 
二、例子程序
這是一個前輩寫的,非常詳細

復制代碼 代碼如下:

//main.cpp
int a = 0;          // 全局初始化區(qū)
char *p1;           // 全局未初始化區(qū)
main()
{
  int b;            // 棧區(qū)
  char s[] = "abc"; // 棧區(qū)
  char *p2;         // 棧區(qū)
  char *p3 = "123456";     // "123456/0" 在常量區(qū),p3在棧區(qū)
  static int c =0;         // 全局(靜態(tài))初始化區(qū)
 
  p1 = (char *)malloc(10);
  p2 = (char *)malloc(20); // 分配得來的10和20字節(jié)的區(qū)域就在堆區(qū)
 
  strcpy(p1, "123456");    // "123456/0" 放在常量區(qū),編譯器可能會將它
                              // 與p3所指向的"123456"優(yōu)化成一個地方。
}

static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?

答:
1)
全局變量(外部變量)的說明之前再冠以static 就構成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式, 靜態(tài)全局變量當然也是靜態(tài)存儲方式。 這兩者在存儲方式上并無不同。這兩者的區(qū)別在于非靜態(tài)全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態(tài)的全局變量在各個源文件中都是有效的。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯誤。

2) 從以上分析可以看出, 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍?! ?nbsp;               

3) static函數(shù)與普通函數(shù)作用域不同,僅在本文件。只在當前源文件中使用的函數(shù)應該說明為內(nèi)部函數(shù)(static),內(nèi)部函數(shù)應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數(shù),應該在一個頭文件中說明,要使用這些函數(shù)的源文件要包含這個頭文件   

綜上所述:

static全局變量與普通的全局變量有什么區(qū)別:

static全局變量只初使化一次,防止在其他文件單元中被引用;   

static局部變量和普通局部變量有什么區(qū)別:

static局部變量只被初始化一次,下一次依據(jù)上一次結果值;   

static函數(shù)與普通函數(shù)有什么區(qū)別:

static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個被調(diào)用中維持一份拷貝
 
 ==============================================================
一個C語言變量分配的實際例子:
 
我們來看看在可執(zhí)行文件中,變量們會被分配在哪些區(qū)里.這里以可執(zhí)行文件為例子,可執(zhí)行文件有固定的內(nèi)存加載地址,符號(函數(shù)/變量的名字)將來在內(nèi)存里的地址連接器是可以提前確定的。
 
源程序編譯連接的結果是形成1堆匯編指令代碼,大致分為.text .data .bss等幾個節(jié)區(qū)(section)。對于.exe文件和.so文件,全局和靜態(tài)變量都放在.data 或.bss段(gas把源文件從頭到尾掃描1遍,才知道一個變量的全部情況:是否定義;類型;是否初始化。然后把初始化的變量在.data段里分配位置和 空間,把沒初始化的變量在.bss段里分配位置和空間,沒定義的變量分配在.undef段)。匯編指令代碼里全局變量表現(xiàn)為一個內(nèi)存地址(全局變量在目標 文件里是一個偏移值,加載進內(nèi)存里是一個內(nèi)存地址)。臨時變量在匯編代碼里變成ebp/esp+n,表現(xiàn)為一個堆棧地址,化為程序正文(.text)的一 部分。有些變量的最終內(nèi)存地址在加載進內(nèi)存之前還不能確定,需要加載進內(nèi)存才可以計算出來.

全局變量 作用域是跨越多個源程序的。因此全局變量不能重名。靜態(tài)變量作用域是位于單個源程序內(nèi)。多個源程序可以有同名的全局靜態(tài)變量。本例中,為了區(qū)分多個同名的靜態(tài)變量,gcc 用 c444和c444.0 來加以區(qū)別。

復制代碼 代碼如下:

[test@redhat]// more aaa.c
# include <stdio.h>
int a111 = 0;              // 全局變量 已初始化
char *p111 = "654321";     // 全局指針變量 已經(jīng)初始化
static int c444 = 9;       // 靜態(tài)全局變量 已經(jīng)初始化
static int c555;           // 靜態(tài)全局變量 未初始化
main()
{
    int b222;              // 局部變量
    char s333[] = "abc";   // 局部變量
    char *p222;            // 局部變量
    char *p333 = "123456";    // 局部變量
    static int c444 =0;       // 已初始化靜態(tài)局部變量,與前面靜態(tài)全局變量重名
    p111 = (char *)malloc(10);
    p222 = (char *)malloc(20);
    strcpy(p111, "123456");
}

相關文章

  • C++虛函數(shù)表與類的內(nèi)存分布深入分析理解

    C++虛函數(shù)表與類的內(nèi)存分布深入分析理解

    對C++ 了解的人都應該知道虛函數(shù)(Virtual Function)是通過一張?zhí)摵瘮?shù)表(Virtual Table)來實現(xiàn)的。簡稱為V-Table。本文就將詳細講講虛函數(shù)表的原理與使用,需要的可以參考一下
    2022-08-08
  • C語言字符串數(shù)組詳解

    C語言字符串數(shù)組詳解

    這篇文章主要介紹了C語言字符串數(shù)組詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言常見的文件操作函數(shù)

    C語言常見的文件操作函數(shù)

    這篇文章主要為大家介紹了C語言文件操作函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++中using的三種用法舉例詳解

    C++中using的三種用法舉例詳解

    最近在使用中,發(fā)現(xiàn)了一種以前沒學過的using用法,于是在這里,將using的幾種用法總結一下,下面這篇文章主要給大家介紹了關于C++中using的三種用法,需要的朋友可以參考下
    2023-02-02
  • C/C++?Qt?TableDelegate?自定義代理組件使用詳解

    C/C++?Qt?TableDelegate?自定義代理組件使用詳解

    TableDelegate自定義代理組件的主要作用是對原有表格進行調(diào)整,本文主要介紹了QT中TableDelegate?自定義代理組件的使用教程,感興趣的朋友可以了解一下
    2021-12-12
  • C++11智能指針unique_ptr用法使用場景分析

    C++11智能指針unique_ptr用法使用場景分析

    unique_ptr 是 C++ 11 提供的用于防止內(nèi)存泄漏的智能指針中的一種實現(xiàn),即使在異常發(fā)生時也可幫助避免資源泄露。這篇文章主要介紹了C++11智能指針unique_ptr用法介紹,需要的朋友可以參考下
    2021-08-08
  • C++中main函數(shù)怎樣調(diào)用類內(nèi)函數(shù)

    C++中main函數(shù)怎樣調(diào)用類內(nèi)函數(shù)

    這篇文章主要介紹了C++中main函數(shù)怎樣調(diào)用類內(nèi)函數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言實現(xiàn)電影管理系統(tǒng)

    C語言實現(xiàn)電影管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)電影管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Matlab實現(xiàn)極坐標堆疊柱狀圖的繪制

    Matlab實現(xiàn)極坐標堆疊柱狀圖的繪制

    極坐標堆疊圖也是風玫瑰圖的常用形式,MATLAB的bar繪制的條形圖可以繪制成堆疊形式,但是并沒有一個自帶函數(shù)可以繪制極坐標堆疊圖。本文將為大家提供Matlab繪制極坐標堆疊柱狀圖的示例代碼,需要的可以參考一下
    2022-08-08
  • wchar_t,char,string,wstring之間的相互轉換

    wchar_t,char,string,wstring之間的相互轉換

    以下是對wchar_t,char,string,wstring之間的相互轉換進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-09-09

最新評論

华阴市| 德钦县| 安化县| 龙海市| 清远市| 奉节县| 正定县| 阳西县| 河北区| 收藏| 广元市| 阳原县| 辽中县| 镇康县| 津南区| 长宁区| 苏尼特右旗| 丹棱县| 隆安县| 兴宁市| 工布江达县| 浮山县| 桐梓县| 吉水县| 时尚| 中山市| 贞丰县| 南川市| 乌拉特中旗| 左权县| 监利县| 南城县| 叶城县| 鄂州市| 聂拉木县| 安远县| 泾阳县| 宁夏| 汶川县| 玛纳斯县| 遵义县|