關於局部指標與棧的一點小結

來源:互聯網
上載者:User

標籤:局部變數   指標   strcpy   

昨天看到strcpy函數的典型實現時,發現該函數的返回值為局部指標變數,當時產生疑問:局部指標在函數結束時不是會被登出掉嗎?為什麼此處沒有呢?

下面給出strcpy函數代碼:

char* Mystrcpy(char* strDest, const char* strSrc){assert((strDest!= NULL)&&(strSrc != NULL));char* adress = strDest;while ((*(strDest++) = *(strSrc++)) != 0);return adress;}

後來在一篇博文中找到了答案,文章網址為:http://blog.csdn.net/summer_liuwei/article/details/6423219。

下面我將我的理解結合堆棧來解釋一下:

首先解釋一下C++中各種變數的存放位置,經常需要操作的記憶體可分為:棧區(存放函數的參數值,局部變數值等)、堆區(一般是由程式員分配的空間)、全域/靜態變數區(存放全域變數和靜態變數,分為初始化地區和未初始化地區)、文字/唯讀常量區(存放常量字串)、程式碼區(即程式碼片段)。

int a = 0;  //全域變數(全域初始化地區)char* p1;   //全域指標變數(全域未初始化區)void func(char* para){int b;  //局部變數(棧區)char s[] = "abc";  //s[]的所有元素儲存在棧上,s只是個符號地址沒有記憶體空間,                   //所以在函數結束時,"abc"被析構掉,s的指向不定char* p2;    //局部變數(棧區),由於其未初始化,其指向不定。             //若是p2=para,則在程式結束時,p2依舊指向該地區(因為para指向的記憶體不在該函數的管轄內)char* p3 = "12345";  //p3在棧上,但12345在文字常量區,所以在函數結束時,"12345"不會被析構掉,p3仍指向該地區static int* c = 0;  //靜態變數(靜態儲存區)p1 = new char[10];  //程式員分配的記憶體在堆上}



上面代碼給出了一些解釋,現在回到一開始的問題,為什麼局部指標adress在函數結束時仍然指向strDest的初始地址?因為strDest所指向的記憶體在strcpy函數結束時不受影響,所以adress自然不會變。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.