C語言基礎(chǔ)篇——5.0詳解C語言變量的四大屬性-創(chuàng)新互聯(lián)

文章目錄
  • 概述
  • C語言變量四大屬性
    • 存儲類
      • 概念解析
      • Linux 內(nèi)存映像并解析
    • 作用域
      • 概念解析
      • 局部變量的代碼塊作用域
      • 函數(shù)名和全局變量的文件作用域
      • 同名變量的掩蔽規(guī)則
    • 生命周期
      • 概念解析
      • 棧變量的生命周期
      • 堆變量的生命周期
      • 數(shù)據(jù)段、bss段變量的生命周期
      • 代碼段、只讀段的生命周期
    • 鏈接屬性
      • 概念解析
      • C語言程序的組織架構(gòu):多個C文件+多個h文件
      • 編譯以文件為單位、鏈接以工程為單位
      • 三種鏈接屬性:外鏈接、內(nèi)鏈接、無鏈接
      • 函數(shù)和全局變量的同名沖突
      • static的第二種用法:修飾全局變量和函數(shù)
  • 結(jié)束語

創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、成都做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元涿鹿做網(wǎng)站,已為上家服務(wù),為涿鹿各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
概述

整個系統(tǒng)(Linux系統(tǒng)、uboot)正常啟動并長期運行是由很多變量共同作用而成的,類比我們社會的運作也是由于一代又一代的人不斷辛勤努力,不斷向社會發(fā)展貢獻自己的價值一樣。本文章從四大特征詳細了解下這類在系統(tǒng)中不斷更新?lián)Q代的“人們” —— C語言變量。


C語言變量四大屬性

C語言四大屬性:存儲類、作用域、生命周期、鏈接屬性


存儲類 概念解析

1、存儲類是存儲類型,描述C語言變量在何地方存儲。
2、內(nèi)存有多重管理方式:棧、堆、數(shù)據(jù)段、bss段、.text段
一個變量的存儲類屬性就是描述這個變量存儲在何種內(nèi)存段中。
3、局部變量分配在棧上,所以它的存儲類就是棧
顯示初始化為非0的全局變量分配在數(shù)據(jù)段
顯示初始化為0和沒有顯示初始化(默認為0)的全局變量分配在bss段

Linux 內(nèi)存映像并解析

Linux 內(nèi)存模型
在這里插入圖片描述
以上是Linux 系統(tǒng)中 內(nèi)存分區(qū)的分布圖,將內(nèi)存地址分為不同的區(qū)域用來存儲對應(yīng)的數(shù)據(jù)內(nèi)容,以下結(jié)合Linux內(nèi)核模型分布圖來了解下這些內(nèi)存段以及其存儲的具體內(nèi)容。

內(nèi)存分區(qū)說明
內(nèi)核映射區(qū)內(nèi)核映射區(qū)就是將操作系統(tǒng)內(nèi)核程序映射到這個區(qū)域了
對于linux中的每一個進程來說,它都以為整個系統(tǒng)中只有它自己和內(nèi)核而已。它認為內(nèi)存地址0xC0000000以下都是它自己的活動空間,0xC0000000以上是OS內(nèi)核的活動空間。
每個進程都活在自己獨立的進程空間中,0 — 3G的空間每個進程是不同的。(因為使用了虛擬地址技術(shù)),但是內(nèi)核是唯一的。
棧內(nèi)存區(qū)存局部變量;函數(shù)調(diào)用傳參過程也會用到棧
文件映射區(qū)文件映射區(qū)就是進程打開了文件后,將文件的內(nèi)容從硬盤讀進進程的文件映射區(qū),以后直接在內(nèi)存中操作這個文件,讀寫完了后在保存時再將內(nèi)存中的文件寫到硬盤中去。
C語言是不會自動向堆中存放東西,堆的操作完全是程序員自己手工操作的。程序員根據(jù)自己的需求申請、使用、釋放。
數(shù)據(jù)段、bss段數(shù)據(jù)段就是(1)顯示初始化為非0的全局變量(2)顯示初始化為非0的static局部變量
bss段就是存(1)系那是初始化為0或者未顯示初始化的全局變量(2)顯示初始化為0或未顯示初始化的static局部變量。
代碼段、只讀數(shù)據(jù)段代碼段就是對應(yīng)程序中的代碼(函數(shù)),代碼段在linux中稱為文本段(.text)
只讀數(shù)據(jù)段就是程序運行期間只能讀不能寫的數(shù)據(jù)。
const修飾的常量可能是存在只讀數(shù)據(jù)段的。

作用域 概念解析

1、作用域是描述這個變量起作用的代碼范圍。
2、C語言變量的作用域規(guī)則是代碼塊作用域。
意思是這個變量起作用的范圍是當前的代碼塊。代碼塊就是一對大括號 {} 擴起來的范圍,所以一個變量的作用域就是這個變量定義所在的 {} 范圍內(nèi)從這個變量定義開始往后的部分。

局部變量的代碼塊作用域

1、代碼塊基本可以理解為一對大括號 {} 括起來的部分。
2、代碼塊不等于函數(shù),if while for 都有 大括號{}
3、局部變量的作用域是代碼塊作用域,也就是說一個局部變量可以被訪問和使用的范圍僅限于定義這個局部變量的代碼塊中定義式之后的部分。

函數(shù)名和全局變量的文件作用域

1、文件作用域就是全局的訪問權(quán)限,也就是在整個.c文件中都可以訪問。這就是平時所說的局部和全局,全局就是文件作用域
2、函數(shù)和全局變量的作用域是定義所在的整個.c文件之內(nèi)定義式之后的部分。

小結(jié):不管是局部變量、全局變量、函數(shù),都要先定義才能使用

同名變量的掩蔽規(guī)則

編程中,不可能避免會出現(xiàn)同名變量。變量同名后不一定會出錯。
1、如果兩個同名變量作用域不同且沒有交疊,這種情況下同名沒有影響。
2、如果兩個同名變量作用域有交疊,C語言規(guī)定在作用域交疊范圍內(nèi),作用域小的一個變量會掩蔽掉作用域大的那種。


生命周期 概念解析

1、生命周期是描述這個變量什么時候誕生(運行時分配內(nèi)存空間給這個變量)以及什么時候死亡(運行時收回這個內(nèi)存空間,此后再不能訪問這個內(nèi)存地址,或者訪問這個內(nèi)存地址已經(jīng)和這個變量無關(guān)了)。
2、研究變量的生命周期可以幫助理解程序運行的一些現(xiàn)象、理解C語言的一些規(guī)則。

棧變量的生命周期

1、局部變量(棧變量)存儲在棧上,生命周期是臨時的。臨時:代碼執(zhí)行過程中按照需要去創(chuàng)建、使用、消亡的。
2、如一個函數(shù)內(nèi)定義的局部變量,在這個函數(shù)每一次被調(diào)用時都會創(chuàng)建一次,然后使用,最后在函數(shù)返回的時候消亡。

堆變量的生命周期

1、堆內(nèi)存空間是客觀存在的,是由操作系統(tǒng)維護的。程序只是去申請然后使用然后釋放。
2、我們只關(guān)心程序使用堆內(nèi)存的這一段時間,所以堆變量生命周期:從malloc申請時誕生,然后使用,直到free時消亡。
3、堆內(nèi)存在malloc之前和free之后不能再去訪問,因此堆內(nèi)存在實踐編程時是被反復(fù)的使用的。

數(shù)據(jù)段、bss段變量的生命周期

1、全局變量的生命周期是永久的。永久:是在程序被執(zhí)行時誕生,在程序終止時消亡。
2、全局變量所占用的內(nèi)存是不能被程序自己釋放的,所以程序如果申請了過多的全局變量會導(dǎo)致這個程序一直占用大量內(nèi)存。

代碼段、只讀段的生命周期

代碼段就是函數(shù),它的生命周期是永久的。
代碼段不只是代碼,還有const類型的常量,還有字符串常量。(const類型的常量、字符常量有時候放在rodata段,有時候放在代碼段,取決于平臺)


鏈接屬性 概念解析

1、鏈接屬性描述的是程序從源代碼到最終可執(zhí)行程序,經(jīng)歷的過程:編譯、鏈接
2。編譯階段就是把源代碼搞成 .o 目標文件,目標文件里面有很多符號和代碼段、數(shù)據(jù)段、bss段等分段。符號就是編程中的變量名、函數(shù)名等。運行時變量名、函數(shù)名能夠和相應(yīng)的內(nèi)存對應(yīng)起來,靠符號來做鏈接的。
3、 .o的目標文件鏈接生成最終可執(zhí)行程序的時候,其實是把符號和相應(yīng)的段連接起來。C語言中的符號有三種鏈接屬性:外鏈接屬性、內(nèi)鏈接屬性、無鏈接屬性

C語言程序的組織架構(gòu):多個C文件+多個h文件

1、整個而又龐大的C語言程序(linux內(nèi)核、uboot)由多個C文件和h文件組成的。
2、程序的生成過程:編譯+鏈接
編譯是為了將函數(shù)/變量等變量.o二進制的機器碼格式
鏈接是為了將各個獨立分開的二進制的函數(shù)鏈接起來形成一個整體的二進制可執(zhí)行程序。

編譯以文件為單位、鏈接以工程為單位

1、編譯器工作時是將所有源文件依次讀進來,單個為單位進行編譯的。
2、鏈接的時候?qū)嶋H上是把第一步編譯生成個單個的.o文件整體的輸入,然后處理鏈接成一個可執(zhí)行程序。

三種鏈接屬性:外鏈接、內(nèi)鏈接、無鏈接

1、外鏈接:外部鏈接屬性可以在整個程序范圍內(nèi)進行鏈接(可以跨文件),如函數(shù)和全局變量
2、內(nèi)鏈接:內(nèi)連接屬性可以在當前C文件內(nèi)部范圍內(nèi)進行鏈接(不能再除當前C文件之外的其他C文件中進行訪問、鏈接)。如static修飾的函數(shù)/全局變量屬于內(nèi)鏈接。
3、無鏈接:不參與鏈接屬性就是跟鏈接沒有關(guān)系。如所有局部變量(auto的、static的)都是無鏈接的。

函數(shù)和全局變量的同名沖突

1、因為函數(shù)和全局變量是外部鏈接屬性,就是每個函數(shù)和全局變量將來在整個程序中所有的C文件都能被訪問,因此在一個程序中的所有C文件中不能出現(xiàn)同名的函數(shù)/同名的全局變量。
2、現(xiàn)在高級語言中完美解決這個問題的方法是命名空間namespace(是給一個變量帶上各個級別的前綴)
3、C語言發(fā)明了一種不是很完美的解決方案,是三種鏈接屬性的方法。思路:將明顯不會在其他C文件中引用(只在當前C文件中引用)的函數(shù)/全局變量,使用static修飾使其成為內(nèi)鏈接屬性,這樣在鏈接時即使2個C文件中有重名的函數(shù)/全局變量,只要其中一個或2個為內(nèi)鏈接屬性就沒事。(在一定程度上解決,沒有根本解決問題)

static的第二種用法:修飾全局變量和函數(shù)

1、普通的函數(shù)/全局變量,默認鏈接屬性是外部的。
2、static修飾的函數(shù)/全局變量,鏈接屬性是內(nèi)部鏈接。


結(jié)束語

本文章介紹到這里。結(jié)合本文章介紹的,從C語言變量的這四大屬性入手了解程序中每一個變量,相信大家都有巨大的收獲。以及可以解釋相關(guān)的疑問,如:“一個函數(shù)內(nèi)的局部變量為什么在函數(shù)外不能使用?” “局部變量為什么分配在棧上?或者說局部變量為什么是臨時生命周期?”等等。這四大屬性相互之間是獨立的,對大家理解代碼可能沒有太大的作用,但是將它們相互關(guān)聯(lián)起來威力可是巨大的。接下來出一個文章將結(jié)合本章的內(nèi)容了解下存儲類關(guān)鍵字的精彩“人生”。 ———— C語言 —— 存儲類相關(guān)的關(guān)鍵字 (持續(xù)更新中…)

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

新聞名稱:C語言基礎(chǔ)篇——5.0詳解C語言變量的四大屬性-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://bm7419.com/article2/hecic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、自適應(yīng)網(wǎng)站、定制開發(fā)、外貿(mào)網(wǎng)站建設(shè)、做網(wǎng)站、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管