• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            printf都做了什么??

            最近在看以前的一些代碼,發現程序中有一些函數返回指針,而且所返回的指針是stack指針,覺得很是奇怪,stack指針都是系統自己維護,出了作用域以后自動釋放的,難道函數所返回的stack指針還能繼續使用?以前的代碼就是那樣,而且運行也一直很正常,這是什么原因?覺得很是怪異。
            為測試stack指針是否由系統管理,從函數中返回后是否繼續可用,寫了一些代碼:
            // TestPointer.cpp : Defines the entry point for the console application.
            //
            #include "stdafx.h"
            #include 
            <windows.h>
            #include 
            <stdlib.h>

            typedef 
            struct Person
            {
                
            int iAge;
                
            int iWeight;
            }
            Person;

            //Printf都做了什么?
            //感覺調用printf時系統對stack進行了清理
            char * GetString(void);
            Person 
            * GetPerson();

            int main(int argc, char* argv[])
            {
                printf(
            "Hello World!\n");

                
            char * pStr = GetString();

                
            //感覺調用printf時系統對stack進行了清理
                printf("%s", pStr); //將這一句去掉后運行試試?

                Person 
            * m_pPersion = GetPerson();
                
                printf(
            "doooooo\n"); //將這一句去掉運行試試?
                printf("Age = %d, Weight = %d\n", m_pPersion->iAge, m_pPersion->iWeight);

                
            return 0;
            }


            char * GetString(void)
            {
                
            //簡單的可以理解為: 
                
            //heap:是由malloc之類函數分配的空間所在地。地址是由低向高增長的。 
                
            //stack:是自動分配變量,以及函數調用的時候所使用的一些空間。地址是由高向低減少的。
                
            //棧(stack)內存的情況
                char szMessage[100];
                strcpy(szMessage, 
            "this is just a test!\n");
                printf(
            "%s", szMessage);
                
            return szMessage;

                
            //堆(heap)內存的情況
                /*char * pRet = (char *)malloc( 100 * sizeof(char));
                strcpy(pRet, "This is just a test!\n");
                return pRet;
            */
                
            }


            Person 
            * GetPerson()
            {
                
            //stack
                Person m_Person;
                m_Person.iAge 
            = 24;
                m_Person.iWeight 
            = 55;

                
            return &m_Person;

                
            //更換成heap形式的又是怎樣?
            }


            上述程序運行環境為:WindowsXP sp2 
            + Visual C++ Enterprise Edition 6.0 + Vs6Sp6
            源代碼

            posted on 2008-04-18 20:32 猶志 閱讀(1732) 評論(5)  編輯 收藏 引用

            評論

            # re: printf都做了什么??[未登錄] 2008-04-18 21:16 steven

            昏。在棧上的數據嘛,肯定沒有問題了。  回復  更多評論   

            # re: printf都做了什么?? 2008-04-18 22:52 lonkil

            你到Release下看看.再用GCC編譯一下試試.

            我試了這幾種情況運行結果都不一樣.

            說明這種用法存在問題,與printf無關.

            應該heap或在調用函數里把空間分配好,傳給子函數賦值.  回復  更多評論   

            # re: printf都做了什么?? 2008-04-19 01:01 嘯天豬

            所謂stack自動清理的意思是:函數調用前后調整棧指針(SP)的任務編譯器會自動幫你完成

            至于指向棧中位置的指針,當然可以隨便用,不過這和把指針指向內存位置0一樣,后果自負

            程序的運行結果無法證明程序的正確性  回復  更多評論   

            # re: printf都做了什么?? 2008-04-19 22:03 starofrainnight

            這是初學者很容易犯錯誤,想當年我初學C++時也是對這個問題覺得很奇怪。

            首先,把棧指針傳遞出來是原則性錯誤,在C++裡是不允許的,而在函數結束後讀取該指針指向的內容的行為是未知的。
            其次,棧內存是在函數開始執行時進行分配,在函數結束進行釋放的。
            再次,棧內容在函數結束是不會被清理的,因為釋放了的內存不需要再去清理。

            但正因為沒有進行清理,在調用此函數後,你馬上讀取該內存,在大部分情況下是可以讀取到原來的內容的,只要沒有其它的程序使用到該塊內存,那些內容是不會改變的,但這種操作是錯誤的,因為該塊內存已經被釋放了,你所讀取的是已經被釋放了的內存的內容。

            根據各種編譯器的編譯結果不同,根據系統需要不同,根據你程序編寫的不同,你這個函數所產生的結果是不可預料的,如上,後果自負。  回復  更多評論   

            # re: printf都做了什么??[未登錄] 2008-05-01 18:51 lynn

            starofrainnight說的很對;正如樓主所述,stack使用是由高向低進行的。而您代碼中描述的:
            char szMessage[100];
            strcpy(szMessage, "this is just a test!\n");
            數組Message是如此之大,而使用卻如此之小,僅"this is just a test!\n"幾個字符。這樣,存儲szMessage時從低址向高址進行,100-22=78個字節尚未使用,退出GetString函數之后。sp指針復原至調用GetString之前的位置。而調用GetPerson的活動記錄太小,以至于沒有破壞szMessage中存儲的22個字符。所以,...
              回復  更多評論   

            導航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            日本久久中文字幕| 久久亚洲精品中文字幕| 2021国产成人精品久久| 久久一区二区三区99| 久久综合九色综合网站| 国产高潮国产高潮久久久91| 久久亚洲国产最新网站| 久久久久亚洲av无码专区喷水| 国产精品成人久久久久久久| 亚洲午夜精品久久久久久浪潮| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 亚洲国产精品人久久| 久久成人国产精品一区二区| 久久无码AV一区二区三区| 久久这里只精品国产99热| 亚洲午夜久久久影院| 狠狠色综合网站久久久久久久| 97精品伊人久久久大香线蕉| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久A级毛片免费观看| 欧美激情精品久久久久久久| 国内精品久久久久久99蜜桃| 亚洲国产视频久久| 99久久国产综合精品五月天喷水| 亚洲级αV无码毛片久久精品| 久久久综合香蕉尹人综合网| 久久青青草原精品影院| 日韩乱码人妻无码中文字幕久久 | 久久久久久狠狠丁香| 中文字幕人妻色偷偷久久| 一级A毛片免费观看久久精品| 亚洲精品高清国产一久久| 国产精品无码久久久久久| 亚洲精品无码久久久影院相关影片| 久久久久久国产精品免费免费| 99久久国产综合精品成人影院| av无码久久久久不卡免费网站| 久久精品亚洲一区二区三区浴池| 狠狠色丁香久久婷婷综合蜜芽五月| 久久久久久亚洲精品不卡| 久久婷婷人人澡人人|