首页 > 代码库 > 关于局部指针与栈的一点小结
关于局部指针与栈的一点小结
昨天看到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个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。