如何用指针申请动态内存?函数的参数是一个指针吗?
如果函数的参数是一个指针,不要指望用该指针去申请动态内存。下面例子中,Test 函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str 依旧是 NULL。
(相关资料图)
void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100); //str 仍然为 NULL strcpy(str, "hello"); //运行错误 }
毛病出在函数 GetMemory 中。编译器总是要为函数的每个参数制作临时副本,指针参数 p 的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p 的内容,就导致参数 p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p 申请了新的内存,只是把_p 所指的内存地址改变了,但是 p 丝毫未变。所以函数 GetMemory并不能输出任何东西。事实上,每执行一次 GetMemory 就会泄露一块内存,因为没有用free 释放内存。
如果非要用指针参数去申请内存, 那么应该改用“指向指针的指针”,看下面的例子:
void GetMemory2(char **p, int num) { *p = (char *)malloc(sizeof(char) * num); } void Test2(void) { char *str = NULL; GetMemory2(&str, 100); // 注意参数是 &str,而不是 str strcpy(str, "hello"); cout<< str << endl; free(str); }
由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。这种方法更加简单,看下面的例子:
char *GetMemory3(int num) { char *p = (char *)malloc(sizeof(char) * num); return p; } void Test3(void) { char *str = NULL; str = GetMemory3(100); strcpy(str, "hello"); cout<< str << endl; free(str); }
用函数返回值来传递动态内存这种方法虽然好用, 但是常常有人把 return 语句用错了。这里强调不要用 return 语句返回指“栈内存”的指针,因为该内存在函数结束时自动消亡,看下面的例子:
char *GetString(void) { char p[] = "hello world"; return p; // 编译器将提出警告 } void Test4(void) { char *str = NULL; str = GetString(); // str 的内容是垃圾 cout<< str << endl; }
用调试器逐步跟踪 Test4, 发现执行 str = GetString 语句后 str 不再是 NULL 指针但是 str 的内容不是“hello world”而是垃圾。如果把上面示例改成下面这样,会怎么样?
char *GetString2(void) { char *p = "hello world"; return p; } void Test5(void) { char *str = NULL; str = GetString2(); cout<< str << endl; }
函数 Test5 运行虽然不会出错,但是函数 GetString2 的设计概念却是错误的。因为 GetString2 内的“hello world”是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用 GetString2,它返回的始终是同一个“只读”的内存块。
标签:
相关推荐:
最新新闻:
- 【钻石杯】中国女篮63-51大胜欧洲劲旅拉脱维亚女篮
- 丢失msvcr100.dll文件如何解决?MSVCR100.dll文件解决办法
- 全球新动态:联想乐PadA14.0预览版泄露 刷机升级方法大揭秘
- miui12.5内测答案是什么?怎么申请miui12.5内测版本?-当前短讯
- 续航200KM的九号电动车长啥样?
- 如何用指针申请动态内存?函数的参数是一个指针吗?
- 知识点补充:什么是互质?互质的详情介绍
- 局域网上任意主机怎么控制?软件实现局域网流量控制
- 为什么会有Base64编码?编码之Base64编码
- 社交领域火爆出圈 Soul向港交所递交上市申请:当前通讯
- 售价2万元的雅迪电动车长什么样?
- 要闻速递:小米首款智能鱼缸仅需449元 半年不用换水
- 世界快看点丨米老鼠微信主题红包怎么玩?米老鼠微信主题气泡设置教程方法
- 颜值无敌!小龟王2023新款电摩1228元|全球速看料
- 当前通讯!K8s怎么安装部署?K8S集群安装部署及操作说明
- 为什么我们会突然被别人超越? 天天聚看点
- 全球快看:Win11将允许你从任务栏强制退出应用程序
- 4080游戏本13999
- 环球热资讯!老电脑升级首选 8G DDR3不到35元
- 卡位iPad!曝三星将于今年推出首款可折叠平板电脑Galaxy Z Tab
- 车库转合同范本(通用5篇) 每日关注
- 卡普空大阪开设新工作室 拥有全国最大的动捕工作室
- 环球新资讯:超过一半的密码AI破解不到1分钟
- JBL蓝牙无线耳机179元 快看
- 世界观热点:长续航 雅迪欧曼2099元
- 开启预售!影驰K8 pro星曜娘联名款键盘来啦!
- 双接口 海康威视128GU盘37.9元_今日热文
- 世界资讯:睾丸恶性间皮瘤
- 《最终幻想:像素重制版》容量揭晓 NS版5.7G
- 精选!Xbox公布精英2青春版手柄宣传片 玩家:精英3呢?
- 乙烷电子式示意图_乙烷电子式
- 全球今日报丨《小美人鱼》真人电影人类公主剧照 比黑人鱼好看多了
- 天天最新:SIE:PS5和XSX的游戏性能对比非常影响玩家
- 【天天时快讯】《异形工厂2》Steam页面上线 支持中文发售日期待定
- 《马里奥》电影大爆!分析师称任天堂将获利3.5亿刀
- 水平接近ChatGPT!昆仑万维国产大语言模型来了
- 传PS5掌机Q-Lite今年11月发售 200美元左右
- 沃尔玛XSX迷你冰箱48美元 游戏玩家的零食神器 当前快报
- 【当前热闻】贾跃亭14亿股权再被冻结!累计被执行超42.3亿元
- 美媒:高通胀给美国低收入家庭带来更大压力 加大贫富差距 精选
- 《最终幻想16》陆行鸟演示 羽毛毛茸茸的想Rua!
- 小米举办米粉节OPEN DAY,500米粉欢聚小米科技园_每日聚焦
- 《生化危机4:重制版》佣兵模式角色强度排名:里昂仅排第二_每日热讯
- 世界要闻:《暗黑4》曝6月2日全球解锁 多平台可玩
- 德阳市旌阳区柏隆镇凤泉社区志愿服务队
- 世界讯息:首销火爆!2599买16G+1T骁龙7 gen 2手机
- 中国品牌海外版图强势扩充 追觅扫地机器人获俄权威媒体金奖:每日看点
- 影像旗舰地位稳了!小米13 Ultra确认可变光圈+全焦段四摄-环球今头条
- 小伙特种兵式旅游引热议:一天刷7景点 次日准时上班|今日看点
- 当前热门:导演回应《圣斗士星矢》真人电影圣衣太拉胯:车田老师的执念
- 高司令:《芭比》真人电影中的肯是我天生就要演的角色
- 《马里奥》大电影预计5月9日上线流媒体!现已开预购
- 世界快讯:《铁拳8》B测还要再等等 想玩4K电脑配置越高越好
- 周杰伦就不正当竞争起诉网易:早与腾讯续约 想听二选一_当前资讯
- 【深化“三零”创建 】淮滨县公安局新里派出所:邻里建房闹矛盾 真情调解促和谐
- 史诗级更新!微软Win11文件资源管理器将迎来大更新,全新界面和功能曝光_时讯
- 天天新消息丨小米三部新品用户满意度99%,雷军:已初步站稳高端化手机战略
- 当前快播:249元!小米米家智能空气炸锅4.5L最大容量款发布:触屏操控、支持小爱同学
- Flyme 10内测招募,魅族17、魅族18系列可升级
- 汉王科技品牌30周年庆典暨春季新品发布会,诚邀您共同见证!
- 世界速看:《生化危机4:重制版》艾什莉脸模短发新视频:樱花与我孰美?
- 环球速递!《满江红》延长上映至5月15日!累计票房达45.44亿
- 张杰演唱会陷入负面风波,与粉丝互动,却被质疑开黄腔 环球今热点
- 全球简讯:官方修改购买规则 《方舟:生存进化》次世代版拆分出售 玩家不买账:卖得更贵了
- 发售两年之后 卡普空终于移除了《生化危机8》D加密|世界新视野
- 双点校园春季更新内容有哪些?双点校园复活节活动汇总-报资讯
- MIT研发高精度识别物体机器手 一次抓握成功率高达85%
- DOAXVV4周年庆狂送70连抽,温泉场景加入游戏
- 细数四个ALIENWARE x14 R2的至尊工艺
- 小米14面板曝光:1mm边框颜值拉满了!
- 莱克天狼星吸尘洗地机,一机搞定全屋清洁,带动行业升级:世界要闻
- 【会议】2023 中国游戏开发者大会(CGDC)——八大专场首次公开
- 不弃疗 不放弃!《战地2042》将上线全部人聊天功能
- 《名侦探柯南:黑铁的鱼影》新宣传图 成人版灰原哀太劲爆
- 联想刘军称2022财年刻骨铭心,PC市场份额仍创新高