亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

全局變量與局部變量在內存中的區別詳細解析

2020-01-26 15:45:28
字體:
來源:轉載
供稿:網友

一、預備知識―程序的內存分配

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

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

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

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

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

5、程序代碼區―存放函數體的二進制代碼(.text)。

二、例子程序
這是一個前輩寫的,非常詳細

復制代碼 代碼如下:

//main.cpp
int a = 0;          // 全局初始化區
char *p1;           // 全局未初始化區
main()
{
  int b;            // 棧區
  char s[] = "abc"; // 棧區
  char *p2;         // 棧區
  char *p3 = "123456";     // "123456/0" 在常量區,p3在棧區
  static int c =0;         // 全局(靜態)初始化區

  p1 = (char *)malloc(10);
  p2 = (char *)malloc(20); // 分配得來的10和20字節的區域就在堆區

  strcpy(p1, "123456");    // "123456/0" 放在常量區,編譯器可能會將它
                              // 與p3所指向的"123456"優化成一個地方。
}

static全局變量與普通的全局變量有什么區別?static局部變量和普通局部變量有什么區別?static函數與普通函數有什么區別?

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

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

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

綜上所述:

static全局變量與普通的全局變量有什么區別:

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

static局部變量和普通局部變量有什么區別:

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

static函數與普通函數有什么區別:

static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝

 ==============================================================
一個C語言變量分配的實際例子:
 
我們來看看在可執行文件中,變量們會被分配在哪些區里.這里以可執行文件為例子,可執行文件有固定的內存加載地址,符號(函數/變量的名字)將來在內存里的地址連接器是可以提前確定的。

源程序編譯連接的結果是形成1堆匯編指令代碼,大致分為.text .data .bss等幾個節區(section)。對于.exe文件和.so文件,全局和靜態變量都放在.data 或.bss段(gas把源文件從頭到尾掃描1遍,才知道一個變量的全部情況:是否定義;類型;是否初始化。然后把初始化的變量在.data段里分配位置和 空間,把沒初始化的變量在.bss段里分配位置和空間,沒定義的變量分配在.undef段)。匯編指令代碼里全局變量表現為一個內存地址(全局變量在目標 文件里是一個偏移值,加載進內存里是一個內存地址)。臨時變量在匯編代碼里變成ebp/esp+n,表現為一個堆棧地址,化為程序正文(.text)的一 部分。有些變量的最終內存地址在加載進內存之前還不能確定,需要加載進內存才可以計算出來.

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

復制代碼 代碼如下:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久成年人视频| 日韩中文字幕在线播放| 午夜精品99久久免费| 91精品国产高清自在线看超| 久久6免费高清热精品| 97精品视频在线观看| 欧美精品一本久久男人的天堂| 欧美激情2020午夜免费观看| 国产精品久久久亚洲| 国产精品美女在线| 2018国产精品视频| 久久影视三级福利片| 欧美电影院免费观看| 亚洲在线观看视频网站| 2018国产精品视频| 欧美一性一乱一交一视频| 国产精品成人av性教育| 亚洲天堂色网站| 亚洲国产成人在线视频| 亚洲影院色在线观看免费| 国产精品久久二区| 精品久久久在线观看| 欧美日韩国产综合视频在线观看中文| 福利一区视频在线观看| 亚洲天堂免费观看| 国内外成人免费激情在线视频| 日韩国产激情在线| 亚洲国产私拍精品国模在线观看| 亚洲人成电影网站色www| 国产一区二区三区在线免费观看| 在线观看日韩专区| 久久成人在线视频| 国产精品丝袜久久久久久不卡| 黑人巨大精品欧美一区免费视频| 国产成人免费av电影| 国产精品美女网站| 色综合天天狠天天透天天伊人| 亚洲第一视频网站| 亚洲精品电影网在线观看| 国产欧美在线视频| 视频在线一区二区| 亚洲精品久久久久久久久| 久久久久久久久久久亚洲| 亚洲精品www久久久| 亚洲黄在线观看| 亚洲欧美日韩直播| 久久久亚洲福利精品午夜| 亚洲人成电影在线观看天堂色| 欧美xxxx做受欧美| 欧美乱大交做爰xxxⅹ性3| 成人av色在线观看| 国产精品成人av在线| 最新中文字幕亚洲| 日韩精品在线影院| 欧美与黑人午夜性猛交久久久| 欧美剧在线观看| 国产精品久久激情| 国产玖玖精品视频| 国产精品永久免费| 国产91色在线免费| 92国产精品久久久久首页| 欧美在线影院在线视频| 超碰精品一区二区三区乱码| 国产区精品视频| 亚洲色图综合久久| 国产精品自拍网| 在线中文字幕日韩| 欧美一区二区三区艳史| 欧美精品一本久久男人的天堂| 亚洲欧美精品suv| 毛片精品免费在线观看| 91精品啪aⅴ在线观看国产| 欧美激情女人20p| 久久久精品视频成人| 欧美日在线观看| 庆余年2免费日韩剧观看大牛| 在线电影欧美日韩一区二区私密| 国产999精品久久久影片官网| 久久九九免费视频| 久久在线视频在线| 成人久久精品视频| 国产脚交av在线一区二区| 欧美成人免费小视频| 亚洲精品一区中文| 精品国产乱码久久久久久婷婷| 久久99热这里只有精品国产| 欧美丰满少妇xxxx| 国产精品男女猛烈高潮激情| 亚洲电影在线观看| 亚洲成人精品视频在线观看| 91精品国产色综合| 亚洲天堂网站在线观看视频| 日韩视频在线观看免费| 日韩国产欧美精品在线| 中文字幕亚洲欧美日韩在线不卡| 国产啪精品视频网站| 日本久久久久久久久久久| 国产一区二区三区在线看| 日本精品va在线观看| 热99精品只有里视频精品| 福利一区福利二区微拍刺激| 最好看的2019的中文字幕视频| 91精品国产九九九久久久亚洲| 91大神福利视频在线| 欧美激情中文字幕乱码免费| 91社区国产高清| 久久久人成影片一区二区三区观看| 欧美精品videossex性护士| 亚洲一区二区三区sesese| 国产精品久久久久久久久免费| 亚洲在线视频福利| 国产精品自在线| 日韩大片在线观看视频| 尤物yw午夜国产精品视频明星| 亚洲成人黄色网址| 午夜精品在线视频| 久久亚洲精品中文字幕冲田杏梨| 97在线观看视频| 国产亚洲视频在线| 国产精品视频在线播放| 精品国产一区二区三区久久久| 亚洲午夜性刺激影院| 久久精品国产久精国产一老狼| 欧美色xxxx| 日本精品久久中文字幕佐佐木| 日韩av中文字幕在线播放| www.久久久久久.com| 中文.日本.精品| 久久久久久久久久久av| 日韩va亚洲va欧洲va国产| 精品国模在线视频| 欧美日韩国产成人在线观看| 欧美国产在线电影| 国产欧美在线观看| 日韩欧美一区二区三区久久| 色悠悠国产精品| 欧美日韩在线视频一区二区| 超碰97人人做人人爱少妇| 国产日韩在线视频| 久久久久免费视频| 亚洲欧美日本精品| 国产一区二区三区毛片| 亚洲精品国产电影| 国产精品99久久久久久www| 国产精品r级在线| 日韩毛片在线观看| 欧美日韩精品国产| 中文字幕在线看视频国产欧美| 97香蕉超级碰碰久久免费软件| 在线视频欧美日韩| 日本午夜人人精品| 日本在线精品视频| 日韩美女福利视频| 久久久久国色av免费观看性色| 亚洲欧美在线第一页| 色综合久久天天综线观看| 一区二区三区黄色| 亚洲人成绝费网站色www| 在线日韩中文字幕| 色狠狠久久aa北条麻妃| 欧美韩国理论所午夜片917电影| 亚洲精品福利资源站| 欧美寡妇偷汉性猛交| 欧美理论电影在线播放|