標籤:局部變數 指標 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自然不會變。