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

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

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

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


C語(yǔ)言變量四大屬性

C語(yǔ)言四大屬性:存儲(chǔ)類(lèi)、作用域、生命周期、鏈接屬性


存儲(chǔ)類(lèi) 概念解析

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

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

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

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

作用域 概念解析

1、作用域是描述這個(gè)變量起作用的代碼范圍。
2、C語(yǔ)言變量的作用域規(guī)則是代碼塊作用域。
意思是這個(gè)變量起作用的范圍是當(dāng)前的代碼塊。代碼塊就是一對(duì)大括號(hào) {} 擴(kuò)起來(lái)的范圍,所以一個(gè)變量的作用域就是這個(gè)變量定義所在的 {} 范圍內(nèi)從這個(gè)變量定義開(kāi)始往后的部分。

局部變量的代碼塊作用域

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

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

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

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

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

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


生命周期 概念解析

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

棧變量的生命周期

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

堆變量的生命周期

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

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

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

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

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


鏈接屬性 概念解析

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

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

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

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

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

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

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

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

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

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

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


結(jié)束語(yǔ)

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

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

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

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

廣告

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

綿陽(yáng)服務(wù)器托管