<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    考一考!Linux C語言思考題4道

    發布時間:2018-5-12 10:02    發布者:技術小白
    關鍵詞: 嵌入式linux、C語言
    1. 解釋main函數參數及其返回值,怎么獲取main的返回值,有什么作用?

    2. printf是怎么實現傳參的?然后,它是怎么去找到format格式里面對應的參數的?

    3. 函數調用的堆棧映像是怎樣的?

    4. int fun(){int a=1,b=1, x; x=a+b: return;}有什么結果?如果能夠編譯的話,會返回數值嗎?返回什么數值?

    解釋main函數參數及其返回值,怎么獲取main的返回值,有什么作用?

    目前來講,標準的main應該是
    int main(int argc, char **argv /* , char **envp */)
    {
        return 0;
    }

    當內核執行C程序時(使用一個exec函數),在調用main函數前先調用一個特殊的啟動例程?蓤绦形募䦟⒋藛永讨付槌绦虻钠鹗嘉恢茫ㄟ@是由連接編輯器設置的,而連接編輯器則由C編輯器調用)

    main函數參數
    啟動例程從內核取得命令行參數和環境變量值,然后按ISO C標準傳遞參數給main函數

    獲取main返回值

    main的返回值是該進程的返回碼,根據該返回碼獲知該程序是否正常執行,或是否發生異常。

    Linux下,執行 echo $? 即可獲取main返回值

    printf是怎么實現傳參的?然后,它是怎么去找到format格式里面對應的參數的?

    這個問題的深層問題:怎么實現可變參數列表?

    思考問題:堆棧中的參數次序

    按參數列表相反的順序壓入到堆棧中,參數列表的第1個參數便位于堆棧中這堆參數的頂部,它距離幀指針的偏移量是一個常數。事實上,任何一個參數距離幀指針的偏移量都是一個常數,這和堆棧中壓入多少個參數并無關系。(回答第1個子問題)

    然后,printf的第一個參數就是字符串指針,是一個常量(被雙引號括起來的那部分),函數通過判斷字符串里面的控制參數的個數來判斷參數的個數和類型。("%d %d"就表示有兩個整形參數)(回答第2個子問題)

    下面是模擬一個printf的實現

          void
           foo(char *fmt, ...)
           {
               va_list ap;
               int d;
               char c, *s;
               va_start(ap, fmt);
               while (*fmt)
                   switch (*fmt++) {
                   case 's':              /* string */
                       s = va_arg(ap, char *);
                       //printf("string %s\n", s);
                       break;
                   case 'd':              /* int */
                       d = va_arg(ap, int);
                       //printf("int %d\n", d);
                       break;
                   case 'c':              /* char */
                       /* need a cast here since va_arg only
                          takes fully promoted types */
                       c = (char) va_arg(ap, int);
                       //printf("char %c\n", c);
                       break;
                   }
               va_end(ap);
           }

    非常類似

    1. 里面一個while把參數列表里面的所有控制參數都“檢索”出來,包括參數類型和個數

    2. 注釋掉的printf可以改變為其他輸出函數(假定為系統的sys_printf)

    函數調用的堆棧映像是怎樣的?

    被調用函數從堆棧幀指針返回,被調用函數并沒有從堆棧中完全清除它的整個堆棧幀:參數還留在那里等待調用函數清除。同樣,它的原因和可變參數列表有關。調用函數把參數壓到堆棧上,所以只有它才知道堆棧中到底有多少個參數。因此,只有調用函數可以安全地清除它們。


    int fun(){int a=1,b=1, x; x=a+b: return;}有什么結果?如果能夠編譯的話,會返回數值嗎?返回什么數值?

    如果,編譯器能夠通過該程序編譯,那么,有可能會返回2;這是編譯器把某個寄存器當作“中間結果暫存器”或臨時位置,并且函數放回值就放在這個寄存器里面,那么,調用函數就會從這個寄存器中獲取被調用函數的返回值。
    以下課程可免費試聽C語言、電子、PCB、STM32、Linux、FPGA、Python、安卓等。
    想學習的你和我聯系預約就可以免費聽課了。宋工Q35--24-65--90-88   Tel/WX:173--17--95--19--08



    本文地址:http://www.portaltwn.com/thread-525697-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區
    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷