欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

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

復(fù)制代碼 代碼如下:

//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); // 分配得來(lái)的10和20字節(jié)的區(qū)域就在堆區(qū)
 
  strcpy(p1, "123456");    // "123456/0" 放在常量區(qū),編譯器可能會(huì)將它
                              // 與p3所指向的"123456"優(yōu)化成一個(gè)地方。
}

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

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

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

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

綜上所述:

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

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

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

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

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

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

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

復(fù)制代碼 代碼如下:

[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");
}

相關(guān)文章

  • c++將數(shù)組名作為函數(shù)參數(shù)對(duì)數(shù)組元素進(jìn)行相應(yīng)的運(yùn)算

    c++將數(shù)組名作為函數(shù)參數(shù)對(duì)數(shù)組元素進(jìn)行相應(yīng)的運(yùn)算

    這篇文章主要介紹了c++將數(shù)組名作為函數(shù)參數(shù)對(duì)數(shù)組元素進(jìn)行相應(yīng)的運(yùn)算,需要的朋友可以參考下
    2014-05-05
  • C++簡(jiǎn)明分析講解引用與函數(shù)提高及重載

    C++簡(jiǎn)明分析講解引用與函數(shù)提高及重載

    今天繼續(xù)開始對(duì)C++核心編程知識(shí)的分享與系統(tǒng)講解,第一,這里會(huì)提到“引用”方法傳參以及剖析引用的本質(zhì);第二,我們對(duì)函數(shù)來(lái)一個(gè)提高,相當(dāng)于進(jìn)階函數(shù)了,包括函數(shù)的默認(rèn)值,簡(jiǎn)單的提一下函數(shù)的占位參數(shù),函數(shù)重載以及注意事項(xiàng),接下來(lái)上正文
    2022-05-05
  • C++實(shí)現(xiàn)LeetCode(137.單獨(dú)的數(shù)字之二)

    C++實(shí)現(xiàn)LeetCode(137.單獨(dú)的數(shù)字之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(137.單獨(dú)的數(shù)字之二),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Matlab利用遺傳算法GA求解非連續(xù)函數(shù)問題詳解

    Matlab利用遺傳算法GA求解非連續(xù)函數(shù)問題詳解

    遺傳算法起源于對(duì)生物系統(tǒng)所進(jìn)行的計(jì)算機(jī)模擬研究。其本質(zhì)是一種高效、并行、全局搜索的方法,能在搜索過程中自動(dòng)獲取和積累有關(guān)搜索空間的知識(shí),并自適應(yīng)地控制搜索過程以求得最佳解。本文將利用其求解非連續(xù)函數(shù)問題,需要的可以參考一下
    2022-09-09
  • C++ const關(guān)鍵字分析詳解

    C++ const關(guān)鍵字分析詳解

    C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性。這篇文章主要介紹了C/C++ 中const關(guān)鍵字的用法,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言實(shí)現(xiàn)求解素?cái)?shù)的N種方法總結(jié)

    C語(yǔ)言實(shí)現(xiàn)求解素?cái)?shù)的N種方法總結(jié)

    哈嘍各位友友們,今天又學(xué)到了很多有趣的知識(shí),現(xiàn)在迫不及待的想和大家分享一下!本文將手把手帶領(lǐng)大家探討利用試除法、篩選法求解素?cái)?shù)的n層境界!都是精華內(nèi)容,可不要錯(cuò)過喲
    2023-01-01
  • C語(yǔ)言函數(shù)調(diào)用的三種實(shí)現(xiàn)方法實(shí)例

    C語(yǔ)言函數(shù)調(diào)用的三種實(shí)現(xiàn)方法實(shí)例

    C語(yǔ)言中函數(shù)的調(diào)用主要有如下三種方法,直接調(diào)用,函數(shù)指針調(diào)用,函數(shù)指針傳遞調(diào)用其中后兩種本質(zhì)一樣,但在有無(wú)返回值時(shí)還稍有差別,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言函數(shù)調(diào)用的三種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2022-01-01
  • C++學(xué)習(xí)小結(jié)之二進(jìn)制轉(zhuǎn)換

    C++學(xué)習(xí)小結(jié)之二進(jìn)制轉(zhuǎn)換

    這篇文章主要介紹了C++學(xué)習(xí)小結(jié)之二進(jìn)制轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下
    2015-07-07
  • C++常用字符串分割方法實(shí)例匯總

    C++常用字符串分割方法實(shí)例匯總

    這篇文章主要介紹了C++常用字符串分割方法實(shí)例匯總,包括了strtok函數(shù)、STL、Boost等常用的各類字符串分割方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法

    C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法

    這篇文章主要介紹了C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論