博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++之函数返回指针
阅读量:4299 次
发布时间:2019-05-27

本文共 1708 字,大约阅读时间需要 5 分钟。

当函数的返回值为指针时,我们必须确保所返回的指针指向的内存空间是有效的。

#include 
#include
using namespace std;char* fun(int mod){ switch(mod){ case 0:{ char a[] = "0123456"; char *pa = a; pa[0]++; cout<<&pa<<"->"<<(void *)pa<<":"<
<
"<<(void *)a<<":"<
<
"<<(void *)a<<":"<
<
"<<(void *)a<<":"<
<
"<<(void *)a<<":"<
<
"<<(void *)a<<":"<
<
"<<(void *)a<<":"<
<
<
"<<(void *)a<<":"<
<
<
"<<(void *)a<<":"<
<
<
"<<(void *)a<<":"<
<
<
"<<(void *)a<<":"<
<
<
"<<(void *)a<<":"<
<
<

运行结果:

0x28fee4->0x28fee8:1123456   456 11234560x28ff14->0x28fee8:╔0x405004->0x405004:22345670x28ff14->0x405004:22345670x28fee0->0x40606a:23456780x28ff14->0x40606a:23456780x28fedc->0x5315d0:44567890x28ff14->0x5315d0:44567890x40500c->0x40608e:45678900x28ff14->0x40608e:45678900x408030->0x5315d0:66789010x28ff14->0x5315d0:6678901

在case 0中所声明的字符串数组保存在栈中,在函数返回时空间被释放,在测试结果中我们可以看到,函数返回后该地址处的数据还在,但随即便被其他值覆盖。

在case 1中所声明的字符串数组由于添加了static关键字,字符串被保存在全局数据区,该区域在程序结束时由系统释放,所以我们可以通过指针访问到字符串。

在case 2中的字符串存放在常量区,不可修改,同样是在程序结束时由系统释放。

在case 3中通过new申请的内存空间位于堆中,并通过delete进行释放,由于在函数中我们并没有释放该处内存,所以当函数返回后可以通过指针进行访问。

在case 4、5中字符串分别保存在常量区与堆中,而指向字符串的指针位于全局数据区,所以在gdb中我们可以通过存放在全局数据区的字符串指针来访问字符串

Breakpoint 2, main () at E:\Code\Cpp\test\test.cpp:6262      delete a;(gdb) p (char *)0x405004$1 = 0x405004 
"2234567"(gdb) p (char *)*(long *)0x40500c$2 = 0x40608e
"4567890"Breakpoint 3, main () at E:\Code\Cpp\test\test.cpp:6767 delete a;(gdb) p (char *)*(long *)0x408030$3 = 0x6216a0 "6678901"

转载地址:http://jqsws.baihongyu.com/

你可能感兴趣的文章
全面理解Java内存模型
查看>>
Java中Synchronized的用法
查看>>
阻塞队列
查看>>
linux的基础知识
查看>>
接口技术原理
查看>>
五大串口的基本原理
查看>>
PCB设计技巧与注意事项
查看>>
linux进程之间通讯常用信号
查看>>
main函数带参数
查看>>
PCB布线技巧
查看>>
关于PCB设计中过孔能否打在焊盘上的两种观点
查看>>
PCB反推理念
查看>>
京东技术架构(一)构建亿级前端读服务
查看>>
git 提示:error: unable to rewind rpc post data - try increasing http.postBuffer
查看>>
php 解决json_encode中文UNICODE转码问题
查看>>
LNMP 安装 thinkcmf提示404not found
查看>>
PHP empty、isset、innull的区别
查看>>
apache+nginx 实现动静分离
查看>>
通过Navicat远程连接MySQL配置
查看>>
phpstorm开发工具的设置用法
查看>>