使用指针做函数返回值和指针(栈内存与堆内存的函数形式使用)

使用指针做函数返回值和指针(栈内存与堆内存的函数形式使用)

ID:11851918

大小:20.50 KB

页数:4页

时间:2018-07-14

使用指针做函数返回值和指针(栈内存与堆内存的函数形式使用)_第1页
使用指针做函数返回值和指针(栈内存与堆内存的函数形式使用)_第2页
使用指针做函数返回值和指针(栈内存与堆内存的函数形式使用)_第3页
使用指针做函数返回值和指针(栈内存与堆内存的函数形式使用)_第4页
资源描述:

《使用指针做函数返回值和指针(栈内存与堆内存的函数形式使用)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、一、使用指针做函数返回值:1、当使用指针做为函数的返回值时,主函数处的char*p;将获得调用函数char*pf;的值,即一个地址值,如oxAE72。此时需要我们注意的是该地址值所指向的空间是否存在(即已向操作系统声明注册,不会被释放,即可能被其他操作修改);2、使用栈内存返回指针是明显错误的,因为栈内存将在调用结束后自动释放,从而主函数使用该地址空间将很危险。例如:char*GetMemory(){charp[]="hi";returnp;}voidmain(){char*str=GetMemo

2、ry();//出错!得到一块已释放的内存printf(str);}3、使用堆内存返回指针是正确的,但是注意可能产生内存泄露问题,在使用完毕后主函数中释放该段内存。例如:char*GetMemory(){char*p=newchar[100];returnp;}voidmain(){char*str=GetMemory();delete[]str;//防止内存泄露!}二、使用指针做函数参数:1、有的情况下我们可能需要需要在调用函数中分配内存,而在主函数中使用,而针对的指针此时为函数的参数。此时应注意

3、形参与实参的问题,因为在C语言中,形参只是继承了实参的值,是另外一个量(ps:返回值也是同理,传递了一个地址值(指针)或实数值),形参的改变并不能引起实参的改变。2、直接使用形参分配内存的方式显然是错误的,因为实参的值并不会改变,如下则实参一直为NULL:voidGetMemory(char*p){char*p=newchar[100];}voidmain(){char*str;GetMemory(str);strcpy(str,"hi");//出错!str=NULL!}3、由于通过指针是可以传值

4、的,因为此时该指针的地址是在主函数中申请的栈内存,我们通过指针对该栈内存进行操作,从而改变了实参的值。voidChange(char*p){*p='b';}voidmain(){chara='a';char*p=&a;Change(p);printf("%c"n",a);//值a改变!}4、根据上述的启发,我们也可以采用指向指针的指针来进行在调用函数中申请,在主函数中应用。如下:假设a的地址为ox23,内容为'a';而str的地址是ox46,内容为ox23;而pstr的地址是ox79,内容为ox4

5、6。我们通过调用函数GetMemory,从而将pstr的内容赋给了p,此时p=ox46。通过对*p(ox23)的操作,即将内存地址为ox23之中的值改为char[100]的首地址,从而完成了对char*str地址的分配。voidGetMemory(char**p){char*p=newchar[100];}voidmain(){chara='a';char*str=&a;char**pstr=&str;GetMemory(pstr);strcpy(str,"hi");}5、注意指针的释放问题,可能

6、形成悬浮指针。当我们释放掉一个指针p后,只是告诉操作系统该段内存可以被其他程序使用,而该指针p的地址值(如ox23)仍然存在。如果再次给这块地址赋值是危险的,应该将p指针置为NULL。调用函数删除主函数中的内存块时,虽然可以通过地址传递直接删除,但由于无法对该指针赋值(形参不能传值),可能造成悬浮指针,所以此时也应该采用指向指针的指针的形参。例如:voidMemoryFree(char**p){delete*p;*p=NULL;}voidmain(){char*str=newchar[100];c

7、har*pstr=&str;MemoryFree(pstr);}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。