C語(yǔ)言-內(nèi)存管理深入

前言

基礎(chǔ)篇介紹了一些關(guān)于C語(yǔ)言?xún)?nèi)存管理的常見(jiàn)概念授嘀,包括內(nèi)存編址气忠、堆棧锰蓬、內(nèi)存操作函數(shù)幔睬、變量和數(shù)組存儲(chǔ)簡(jiǎn)介等等。本文將在前文的基礎(chǔ)上擴(kuò)展以下知識(shí):結(jié)構(gòu)體變量的存儲(chǔ)芹扭、函數(shù)調(diào)用與內(nèi)存分配麻顶、遞歸函數(shù)的調(diào)用過(guò)程。如果有需要瀏覽上一篇文章的同學(xué)請(qǐng)點(diǎn)擊C語(yǔ)言-內(nèi)存管理基礎(chǔ)舱卡。希望本文能給正在學(xué)習(xí)C辅肾、Objective-C、C++等語(yǔ)言的小伙伴們更多啟發(fā)轮锥。

結(jié)構(gòu)體變量的存儲(chǔ)

結(jié)構(gòu)體在C語(yǔ)言中是一種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)矫钓,開(kāi)發(fā)中系統(tǒng)提供的基本類(lèi)型往往不能滿(mǎn)足需要,所以會(huì)常常使用到“結(jié)構(gòu)體”舍杜。作為由基本數(shù)據(jù)類(lèi)型組合而成的結(jié)構(gòu)體與普通變量存儲(chǔ)不一樣新娜,結(jié)構(gòu)體變量占用空間不是簡(jiǎn)單的結(jié)構(gòu)體成員空間單純相加,其在內(nèi)存中分配空間和數(shù)組很類(lèi)似既绩,可以總結(jié)為以下幾點(diǎn):

  • 結(jié)構(gòu)體變量占用的內(nèi)存空間是其成員占用最大內(nèi)存空間的整數(shù)倍
struct Person {
    int age;
    int hegiht;
    int weight;
};
int main(int argc, const char * argv[]) {
    struct Person p1 = {1, 2, 3};
    int size = sizeof(p1);
    printf("%i\n",size);              //12 = 4 * 3
    printf("變量的地址:%p\n",&p1);     //0x7fff5fbff750
    printf("%p\n",&p1.age);           //0x7fff5fbff750
    printf("%p\n",&p1.hegiht);        //0x7fff5fbff754
    printf("%p\n",&p1.weight);        //0x7fff5fbff758
    return 0;
}

結(jié)構(gòu)體變量?jī)?nèi)存分配示意圖1

說(shuō)明:在p1變量中概龄,由于其成員都是int類(lèi)型,在64位編譯器中占用4個(gè)字節(jié)空間饲握,所以系統(tǒng)為p1變量分配的內(nèi)存空間大小應(yīng)該是:4 X 3 = 12個(gè)字節(jié)私杜。另外:結(jié)構(gòu)體成員內(nèi)存地址分配是從低地址到高地址的,結(jié)構(gòu)體變量的地址是其首成員的地址互拾,這點(diǎn)和數(shù)組是一致的歪今。

  • 系統(tǒng)從結(jié)構(gòu)體首個(gè)成員分配空間;如果空間不夠則重新分配颜矿,如果空間剩余則會(huì)把下一個(gè)成員的數(shù)據(jù)存儲(chǔ)到剩余的空間中
struct Student { 
      char id;
      double score;
      int  age;    
};
int main(int argc, const char * argv[]) { 
      struct Student s1 = {'A', 10.0, 15};  
      int size = sizeof(s1);   
      printf("%i\n",size);       //24
      printf("%p\n",&s1.id);     //0x7fff5fbff788
      printf("%p\n",&s1.score);  //0x7fff5fbff790
      printf("%p\n",&s1.age);    //0x7fff5fbff798
      return 0;
}

結(jié)構(gòu)體變量?jī)?nèi)存分配示意圖2

說(shuō)明:按照前面的說(shuō)明寄猩,系統(tǒng)為s1分配內(nèi)存時(shí)以sizeof(double)8個(gè)字節(jié)為單位,所以為s1.id分配了8個(gè)字節(jié)的空間骑疆,但是由于id定義為char類(lèi)型田篇,所以只占了8個(gè)字節(jié)中數(shù)值最小的一個(gè)內(nèi)存空間;由于前面剩下的 8 - 1 = 7個(gè)字節(jié)不足以存放double類(lèi)型的值箍铭,所以接著為s1.score分配8個(gè)字節(jié)并占滿(mǎn)8個(gè)字節(jié)空間泊柬;最后為s1.age分配8個(gè)字節(jié)并占用了前4個(gè)字節(jié)空間。故s1變量在內(nèi)存中占用的內(nèi)存大小為 8 X 3 = 24個(gè)字節(jié)诈火。
如果調(diào)換結(jié)構(gòu)體Student成員之間的順序如下兽赁,情況又會(huì)發(fā)生變化。

struct Student {
      double score;
      char id;
      int  age;
};
int main(int argc, const char * argv[]) {
      struct Student s1 = {'A', 10.0, 15};
      int size = sizeof(s1);
      printf("%i\n",size); //16
      printf("%p\n",&s1.score) //0x7fff5fbff790
      printf("%p\n",&s1.id); //0x7fff5fbff790
      printf("%p\n",&s1.age); //0x7fff5fbff79c
      return 0;
}

結(jié)構(gòu)體變量?jī)?nèi)存分配示意圖3

說(shuō)明:這是由于第二次為s1.id分配內(nèi)存時(shí)沒(méi)有完全占滿(mǎn)8個(gè)字節(jié)的空間,而且第三次為s1.age分配時(shí)其需要的4個(gè)字節(jié)空間也沒(méi)有超出剩余的8-1 = 7個(gè)字節(jié)空間刀崖,所以s1.age的值按照內(nèi)存對(duì)齊的原則就存放在了第二次分配的8個(gè)字節(jié)的后4位空間中惊科。

  • 為結(jié)構(gòu)體變量分配內(nèi)存還需要遵循內(nèi)存對(duì)齊原則
    內(nèi)存對(duì)齊:系統(tǒng)在為不同類(lèi)型的變量分配空間時(shí)按照一定的規(guī)則在空間上排列,而不是順序的一個(gè)接一個(gè)的排放亮钦,這是對(duì)內(nèi)存對(duì)齊的模糊解釋馆截。簡(jiǎn)單來(lái)說(shuō)每個(gè)特定平臺(tái)上的編譯器都有自己的默認(rèn)“對(duì)齊系數(shù)”(也叫對(duì)齊模數(shù) n=1,2,4,8,16)。不同的對(duì)齊系數(shù)會(huì)對(duì)結(jié)構(gòu)體變量分配的內(nèi)存空間產(chǎn)生影響蜂莉。關(guān)于“內(nèi)存對(duì)齊和結(jié)構(gòu)體變量“的更多內(nèi)容這里引用幾篇相關(guān)文章幫助大家深入理解:
    【知乎】-如何理解 struct 的內(nèi)存對(duì)齊蜡娶?
    【CSDN】-C內(nèi)存對(duì)齊
    【CSDN】-C/C++內(nèi)存對(duì)齊原則及作用
    【個(gè)人博客】-內(nèi)存對(duì)齊

總結(jié):結(jié)構(gòu)體變量所占存儲(chǔ)空間受其不同類(lèi)型的成員排列順序及編譯器內(nèi)存對(duì)齊影響,開(kāi)發(fā)中盡量將相同類(lèi)型的成員依次定義映穗,有助于節(jié)省內(nèi)存空間窖张。

函數(shù)調(diào)用與內(nèi)存分配

函數(shù)作為編程中實(shí)現(xiàn)功能的重要手段,深入理解函數(shù)的調(diào)用過(guò)程對(duì)提升開(kāi)發(fā)能力有很大的幫助蚁滋,首先了解一下兩個(gè)任意函數(shù)之間進(jìn)行調(diào)用的情形荤堪,與匯編程序設(shè)計(jì)中主程序和子程序之間的鏈接及信息交換類(lèi)似,在高級(jí)語(yǔ)言編寫(xiě)的程序中(比如C語(yǔ)言)枢赔,調(diào)用函數(shù)與被調(diào)用函數(shù)之間的鏈接及信息交換需要通過(guò)棧來(lái)進(jìn)行∮抵《C程序設(shè)計(jì)》一書(shū)中對(duì)于函數(shù)之間調(diào)用提出兩個(gè)注意點(diǎn):

  • 函數(shù)運(yùn)行期間調(diào)用另外一個(gè)函數(shù)踏拜,在運(yùn)行被調(diào)用函數(shù)之前,系統(tǒng)需要先完成3件事情:
  1. 將所有的實(shí)參低剔、返回地址等信息傳遞給被調(diào)用函數(shù)保存
  2. 為被調(diào)用函數(shù)局部變量在棧上分配內(nèi)存
  3. 將控制轉(zhuǎn)移到被調(diào)用函數(shù)入口
  • 被調(diào)用函數(shù)返回調(diào)用函數(shù)之前速梗,系統(tǒng)也需要相應(yīng)的完成3件事情:
    1. 在棧中保存被調(diào)用函數(shù)的計(jì)算結(jié)果(返回值)
    2. 釋放在棧中為被調(diào)用函數(shù)分配的數(shù)據(jù)區(qū)
    3. 依照被調(diào)用函數(shù)保存的返回地址將控制轉(zhuǎn)移到調(diào)用函數(shù)

當(dāng)有多個(gè)函數(shù)嵌套調(diào)用時(shí),按照 “后調(diào)用先返回” 的原則依次進(jìn)行襟齿,看到這里想必大家一目了然姻锁,函數(shù)之間的調(diào)用規(guī)則和 “棧” 管理數(shù)據(jù)的方式完全相同猜欺,因此函數(shù)之間的信息傳遞和控制轉(zhuǎn)移必須通過(guò) “椢涣ィ”來(lái)實(shí)現(xiàn)。
《數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)》一書(shū)中對(duì)函數(shù)的調(diào)用過(guò)程在內(nèi)存中的描述是這樣的:

函數(shù)之間信息傳遞和控制轉(zhuǎn)移必須通過(guò)“椏螅”來(lái)實(shí)現(xiàn)涧黄,即系統(tǒng)將整個(gè)程序運(yùn)行所需的數(shù)據(jù)空間安排在一個(gè)棧中,每當(dāng)調(diào)用一個(gè)函數(shù)就為它在棧頂分配一個(gè)存儲(chǔ)區(qū)赋荆,每當(dāng)從一個(gè)函數(shù)退出時(shí)笋妥,就釋放它的存儲(chǔ)區(qū),當(dāng)前正在運(yùn)行的函數(shù)存儲(chǔ)區(qū)必在棧頂窄潭。

  • 幀棧
    幀棧也叫過(guò)程活動(dòng)記錄春宣,是編譯器用來(lái)實(shí)現(xiàn)過(guò)程/函數(shù)調(diào)用的一種數(shù)據(jù)結(jié)構(gòu)。每個(gè)棧幀對(duì)應(yīng)著一個(gè)未運(yùn)行完的函數(shù)。棧幀中保存了該函數(shù)形參月帝、返回地址躏惋、局部變量等信息。簡(jiǎn)而言之棧幀就是一個(gè)函數(shù)執(zhí)行的環(huán)境嫁赏。有時(shí)候函數(shù)嵌套調(diào)用其掂,棧中會(huì)有多個(gè)函數(shù)的信息,每個(gè)函數(shù)占用一個(gè)連續(xù)的區(qū)域潦蝇。引文中提到的“存儲(chǔ)區(qū)”就是指一個(gè)函數(shù)對(duì)應(yīng)的分配空間也就是一個(gè)函數(shù)幀款熬。
  • 參數(shù)的傳遞和內(nèi)存分配
    被調(diào)用函數(shù)的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí)不占用內(nèi)存空間攘乒,發(fā)生函數(shù)調(diào)用時(shí)贤牛,形參按照確定的類(lèi)型在該函數(shù)幀中被分配指定大小的空間。并且由調(diào)用函數(shù)的實(shí)參傳遞給被調(diào)用函數(shù)的形參保存则酝。
  • 函數(shù)具體調(diào)用過(guò)程:
    1. 為被調(diào)用函數(shù)在棧頂分配空間殉簸,為被調(diào)用函數(shù)的形參分配空間
    2. 將實(shí)參的值傳遞給形參
    3. 被調(diào)用函數(shù)利用形參(如果存在)進(jìn)行運(yùn)算
    4. 通過(guò)return語(yǔ)句將返回值帶回調(diào)用函數(shù)
    5. 調(diào)用結(jié)束,釋放被調(diào)用函數(shù)空間沽讹,釋放其形參分配空間

舉個(gè)例子說(shuō)明問(wèn)題

int add(int num1, int num2) {
         int tempSum = num1 + num2;
         return tempSum;
}
int main(int argc, const char * argv[]) {
          int a = 10;
          int b = 20;
          int sum = add(a, b);
          printf("%i\n",sum); //   sum = 30
          return 0;
}

上面的main()般卑、add()函數(shù)之間調(diào)用的過(guò)程及參數(shù)傳遞在內(nèi)存的示意圖如下:

函數(shù)調(diào)用參數(shù)分配示意圖

(1)首先執(zhí)行main()函數(shù),系統(tǒng)為main()函數(shù)在棧頂分配一定大小的空間爽雄,其次為a蝠检、b局部變量分配空間;(2)調(diào)用add()函數(shù)挚瘟,main()函數(shù)壓入棧底叹谁,棧頂指針上移,系統(tǒng)為add()函數(shù)在棧頂分配一定大小的空間乘盖,其次為num1焰檩、num2局部變量分配空間;(3)執(zhí)行兩個(gè)整數(shù)的加法運(yùn)算订框,在add()函數(shù)幀中新開(kāi)辟一塊空間存放計(jì)算后的結(jié)果tempSum析苫;(4)最后add()函數(shù)返回,在main()函數(shù)幀中開(kāi)辟一塊新的空間存放add()函數(shù)的返回值sum穿扳,(5)add()函數(shù)幀調(diào)用結(jié)束出棧藤违,系統(tǒng)釋放其空間并且棧頂指針下移,main()函數(shù)重新回到棧頂纵揍。

注意:當(dāng)前正在運(yùn)行的函數(shù)存儲(chǔ)區(qū)必在棧頂顿乒。

以上就是兩個(gè)函數(shù)在調(diào)用過(guò)程中棧內(nèi)存完整的工作情況(省略了main()函數(shù)形參的內(nèi)存分配)。雖然函數(shù)在開(kāi)發(fā)中無(wú)處不見(jiàn)泽谨,但是執(zhí)行過(guò)程在內(nèi)存中的表現(xiàn)形式還是有很多值得研究的璧榄。掌握其內(nèi)存分配原理有助于我們更加深入理解函數(shù)特漩。

遞歸函數(shù)的調(diào)用過(guò)程

  • 遞歸函數(shù)
    在調(diào)用一個(gè)函數(shù)過(guò)程中又出現(xiàn)直接或間接調(diào)用該函數(shù)本身的情況,稱(chēng)為函數(shù)的遞歸調(diào)用骨杂。C語(yǔ)言的特點(diǎn)之一就是允許函數(shù)的遞歸調(diào)用涂身。
  • 遞歸函數(shù)的調(diào)用過(guò)程
    一個(gè)遞歸函數(shù)的運(yùn)行過(guò)程類(lèi)似于多個(gè)函數(shù)之間的嵌套調(diào)用,只是調(diào)用函數(shù)和被調(diào)用函數(shù)是同一個(gè)函數(shù)搓蚪,因此蛤售,和每次調(diào)用相關(guān)的一個(gè)重要概念是遞歸函數(shù)運(yùn)行的“層數(shù)”。假設(shè)調(diào)用該遞歸函數(shù)的主函數(shù)為第 0 層妒潭,主函數(shù)調(diào)用遞歸函數(shù)進(jìn)入第一層悴能;從第 i 層調(diào)用本函數(shù)為進(jìn)入第 i+1 層,反之雳灾,退出第 i 層遞歸則應(yīng)返回至第 i - 1 層漠酿。例如:
int getAge(int n) {
      if (n == 1) {
          return 10;
      } else {      
          return getAge(n-1) + 2;
      }
}
int main(int argc, const char * argv[]) {
      printf("NO.5.age: %d\n",getAge(5));
      return 0;
}
遞歸函數(shù)調(diào)用過(guò)程

《數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)》對(duì)遞歸函數(shù)調(diào)用從內(nèi)存分配角度的解釋如下:

為了保證遞歸函數(shù)正確執(zhí)行,系統(tǒng)建立一個(gè)“遞歸工作椈涯叮”作為整個(gè)遞歸函數(shù)運(yùn)行期間使用的數(shù)據(jù)存儲(chǔ)區(qū)炒嘲,每一層遞歸所需信息構(gòu)成一個(gè)“工作記錄”,其中包括所有的實(shí)參匈庭、局部變量以及上一層的返回地址夫凸。每進(jìn)入一層遞歸,就產(chǎn)生一個(gè)新的工作記錄壓入棧頂阱持。每退出一層遞歸寸痢,就從棧頂彈出一個(gè)工作記錄。當(dāng)前活動(dòng)的工作記錄成為“活動(dòng)記錄”紊选,并稱(chēng)活動(dòng)記錄的棧頂指針為“當(dāng)前環(huán)境指針”。

一個(gè)遞歸問(wèn)題可以分為“遞推”和“回溯”兩個(gè)階段道逗,要經(jīng)歷若干步才能求出最后的結(jié)果兵罢。但是其原理和一般函數(shù)的調(diào)用沒(méi)有本質(zhì)區(qū)別。遞歸函數(shù)調(diào)用次數(shù)越多滓窍,在棧上為其分配的空間就越大卖词,所以我們應(yīng)該避免調(diào)用次數(shù)過(guò)多的遞歸函數(shù),因?yàn)樵摬僮骱芸赡軙?huì)使棧的容量“溢出”吏夯。
由于”遞歸函數(shù)“概念本身不是本文的重點(diǎn)此蜈,這里僅僅是介紹一下遞歸函數(shù)調(diào)用在內(nèi)存中分配情況。對(duì)”遞歸函數(shù)“不甚了解的同學(xué)可以查閱一下相關(guān)資料噪生,這里就不再贅述了裆赵。

文章最后

以上就是筆者對(duì)于C語(yǔ)言?xún)?nèi)存管理深入的學(xué)習(xí)心得,知識(shí)點(diǎn)比較少跺嗽,部分描述引自書(shū)籍文檔战授。如果文中有任何紕漏或錯(cuò)誤歡迎在評(píng)論區(qū)留言指出页藻,本人將在第一時(shí)間修改過(guò)來(lái);喜歡我的文章植兰,可以關(guān)注我以此促進(jìn)交流學(xué)習(xí)份帐; 如果覺(jué)得此文戳中了你的G點(diǎn)請(qǐng)隨手點(diǎn)贊;轉(zhuǎn)載請(qǐng)注明出處楣导,謝謝支持废境。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市筒繁,隨后出現(xiàn)的幾起案子噩凹,更是在濱河造成了極大的恐慌,老刑警劉巖膝晾,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栓始,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡血当,警方通過(guò)查閱死者的電腦和手機(jī)幻赚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)臊旭,“玉大人落恼,你說(shuō)我怎么就攤上這事±胙” “怎么了佳谦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)滋戳。 經(jīng)常有香客問(wèn)我钻蔑,道長(zhǎng),這世上最難降的妖魔是什么奸鸯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任咪笑,我火速辦了婚禮,結(jié)果婚禮上娄涩,老公的妹妹穿的比我還像新娘窗怒。我一直安慰自己,他們只是感情好蓄拣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布扬虚。 她就那樣靜靜地躺著,像睡著了一般球恤。 火紅的嫁衣襯著肌膚如雪辜昵。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天咽斧,我揣著相機(jī)與錄音路鹰,去河邊找鬼贷洲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晋柱,可吹牛的內(nèi)容都是我干的优构。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼雁竞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钦椭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起碑诉,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤彪腔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后进栽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體德挣,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年快毛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了格嗅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唠帝,死狀恐怖屯掖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情襟衰,我是刑警寧澤贴铜,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站瀑晒,受9級(jí)特大地震影響绍坝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苔悦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一轩褐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧间坐,春花似錦、人聲如沸邑退。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)地技。三九已至蜈七,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莫矗,已是汗流浹背飒硅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工砂缩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人三娩。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓庵芭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親雀监。 傳聞我的和親對(duì)象是個(gè)殘疾皇子双吆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • C語(yǔ)言中內(nèi)存分配 在任何程序設(shè)計(jì)環(huán)境及語(yǔ)言中,內(nèi)存管理都十分重要会前。在目前的計(jì)算機(jī)系統(tǒng)或嵌入式系統(tǒng)中好乐,內(nèi)存資源仍然是...
    一生信仰閱讀 1,151評(píng)論 0 2
  • 原文地址:C語(yǔ)言函數(shù)調(diào)用棧(一)C語(yǔ)言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過(guò)程可看作連續(xù)的函數(shù)調(diào)用。當(dāng)一個(gè)函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,591評(píng)論 1 19
  • 前言 C語(yǔ)言作為一門(mén)應(yīng)用途廣泛瓦宜、功能強(qiáng)大蔚万、使用靈活的面向過(guò)程式編程語(yǔ)言。既可用于編寫(xiě)應(yīng)用軟件临庇,又能用于編寫(xiě)系統(tǒng)軟件...
    老板娘來(lái)盤(pán)一血閱讀 12,970評(píng)論 32 83
  • 題目類(lèi)型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別反璃? C沒(méi)有Protection行為...
    阿面a閱讀 7,643評(píng)論 0 10
  • 凌晨1點(diǎn)半侄泽,在孩子的哭鬧中醒來(lái)礁芦,迷迷糊糊爬起來(lái)給孩子沖奶粉,90ml的水悼尾,3平勺的奶粉柿扣,然后用勺子攪勻,在冷水中沖...
    我這是嬰兒肥閱讀 157評(píng)論 0 0