首页 > 编程语言 > 详细

C++函数形参传指针的再次讨论

时间:2014-01-28 01:19:03      阅读:386      评论:0      收藏:0      [点我收藏+]

先来看一段代码:

void GetMemory(char *p)
{
	p = new char[20];
}

void Test()
{
	char * str = NULL;
	GetMemory(str);
	strcpy(str,"hello,world");
	
	delete str;
	str = NULL;
}

每一个程序员在面试中都会遇到的问题,上面那段代码问题在哪里呢?

(1) 会造成内存泄漏

(2) 在strcpy会出现程序奔溃。

以下是具体的问题分析:

我们知道函数一般都是传值,即使是指针的值,也是一个数值而已。下面通过调试来看看str的值的变化:


bubuko.com,布布扣

第1步刚刚进入Test函数,str分配好地址0x0012f464,但是里面的值为0xcccccccc,即为没有初始化的值



bubuko.com,布布扣

第2步在Test函数中,str被赋值为NULL即,此时str的地址0x0012f464,但是里面的值为0x00000000,注意因为此时没有进入子函数GetMemory,所以p还没有分配内存



bubuko.com,布布扣

第3步进入子函数GetMemory中,str的值被传递给新申请的p。此时p的地址0x0012f384,但是里面的值为0x00000000



bubuko.com,布布扣

第4步在子函数GetMemory中,在堆上申请的 new char[20]返回的地址值保存在p中。此时p的值已经由之前的0x0012f384变为0x0035cf08;




bubuko.com,布布扣

第5步在跳出子函数GetMemory,返回到Test函数中,这时候的各种状态很重要,str的值还是之前的,没有任何改变。虽然临时变量p的值变化了。

   通过上面的一系列调试截图,我们知道函数传递时仅仅是传递的值。借用一位网友的总结:

“函数的参数进行值拷贝,即使传的是指针,也的对指针(即指针里存的地址)的拷贝。”

遇到搞不清楚的时候勤动手,多调试,肯定会搞明白的。


参考网址列表:

http://www.cppblog.com/mzty/archive/2006/07/07/9531.html

http://www.cnblogs.com/nerohwang/p/3481725.html



C++函数形参传指针的再次讨论

原文:http://blog.csdn.net/liquanhai/article/details/18811075

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!