news 2026/7/5 20:33:09

复制字符串而不是直接赋值指针

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
复制字符串而不是直接赋值指针

复制字符串而不是直接赋值指针

(LeetCode:2418.按身高排序)

1.why?

  • 数据独立性:
    复制字符串使返回结果与输入数据完全独立
    修改返回数组中的字符串不会意外影响原始数据(可移植性)
    原始数据被释放后,返回结果仍然有效

  • 内存安全:

    • 避免悬垂指针问题(如果原始数组被释放)
    • 符合"caller负责free"的接口约定(返回完全独立的内存块)

2.示例:

(1)直接复制指针:

/** * Note: The returned array must be malloced, assume caller calls free(). */#defineunlikely(x)__builtin_expect(!!(x),0)intcmp(constvoid*a,constvoid*b){int*rwna=(*(int**)a);int*rwnb=(*(int**)b);returnrwnb[0]-rwna[0];//降序排列}char**sortPeople(char**names,intnamesSize,int*heights,intheightsSize,int*returnSize){*returnSize=0;//分配空间来存储,第一个储存升高,第二个存储下标int**ret=(int**)malloc(sizeof(int*)*heightsSize);if(unlikely(!ret)){returnNULL;}for(inti=0;i<heightsSize;i++){ret[i]=(int*)malloc(sizeof(int)*2);if(unlikely(!ret[i])){for(intk=0;k<=(*returnSize);k++){free(ret[k]);}free(ret);returnNULL;}ret[i][0]=heights[i];ret[i][1]=i;(*returnSize)++;}//二维数组排序qsort(ret,heightsSize,sizeof(int*),cmp);char**ans=(char**)malloc(sizeof(char*)*heightsSize);if(unlikely(!ans)){returnNULL;}for(inti=0;i<heightsSize;i++){ans[i]=(char*)malloc(sizeof(char)*namesSize);ans[i]=names[ret[i][1]];}// 释放临时数组for(inti=0;i<heightsSize;i++){free(ret[i]);}free(ret);returnans;}

(2)运用strcpy函数:

/** * Note: The returned array must be malloced, assume caller calls free(). */#defineunlikely(x)__builtin_expect(!!(x),0)intcmp(constvoid*a,constvoid*b){int*rwna=(*(int**)a);int*rwnb=(*(int**)b);returnrwnb[0]-rwna[0];//降序排列}char**sortPeople(char**names,intnamesSize,int*heights,intheightsSize,int*returnSize){*returnSize=0;//分配空间来存储,第一个储存升高,第二个存储下标int**ret=(int**)malloc(sizeof(int*)*heightsSize);if(unlikely(!ret)){returnNULL;}for(inti=0;i<heightsSize;i++){ret[i]=(int*)malloc(sizeof(int)*2);if(unlikely(!ret[i])){for(intk=0;k<=(*returnSize);k++){free(ret[k]);}free(ret);returnNULL;}ret[i][0]=heights[i];ret[i][1]=i;(*returnSize)++;}//二维数组排序qsort(ret,heightsSize,sizeof(int*),cmp);char**ans=(char**)malloc(sizeof(char*)*heightsSize);if(unlikely(!ans)){returnNULL;}// for(int i=0;i<heightsSize;i++)// {// ans[i]=(char *)malloc(sizeof(char)*namesSize);// ans[i]=names[ret[i][1]];// }// return ans;for(inti=0;i<heightsSize;i++){// 复制字符串而不是直接赋值指针ans[i]=(char*)malloc(strlen(names[ret[i][1]])+1);if(unlikely(!ans[i])){// 释放已分配的内存for(intj=0;j<i;j++){free(ans[j]);}free(ans);for(intk=0;k<heightsSize;k++){free(ret[k]);}free(ret);returnNULL;}strcpy(ans[i],names[ret[i][1]]);}// 释放临时数组for(inti=0;i<heightsSize;i++){free(ret[i]);}free(ret);returnans;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 2:25:22

基于Android的高校教室预约管理平台系统(源码+lw+部署文档+讲解等)

课题介绍 本课题聚焦高校教室预约流程繁琐、资源调度混乱、信息同步不及时的痛点&#xff0c;设计实现基于 Android 的高校教室预约管理平台。系统以 Java 为核心开发语言&#xff0c;基于 Android 原生框架搭建移动端应用&#xff0c;搭配轻量后端服务架构&#xff0c;处理教室…

作者头像 李华
网站建设 2026/7/4 19:31:30

开源不输商用!LobeChat媲美ChatGPT的用户体验实测

开源不输商用&#xff01;LobeChat媲美ChatGPT的用户体验实测 在大模型浪潮席卷全球的今天&#xff0c;越来越多用户开始体验像 ChatGPT 这样“聪明”的对话助手。流畅的交互、自然的语言生成、近乎即时的响应——这些原本只属于顶级商业产品的体验&#xff0c;正被一个开源项目…

作者头像 李华
网站建设 2026/7/3 13:50:39

十三、Kafka基础环境实战

此次实验有些许复杂,需要细心操作 首先,拍快照 1.切换到opt目录 cd /opt 2.上传kafka包并解压 3.解压文件 tar -zxf kafka_2.11-2.0.0.tgz 4.改名字 mv kafka_2.11-2.0.0 kafka211 5.创建日志文件 mkdir /opt/kafka211/log 6.切换到config目录 cd /opt/kafka211/co…

作者头像 李华
网站建设 2026/7/4 9:02:50

EmotiVoice 安装与环境配置指南

EmotiVoice 安装与环境配置指南 在 AI 语音技术快速演进的今天&#xff0c;传统 TTS 引擎逐渐暴露出“情感单一”“音色固化”的短板。而 EmotiVoice 的出现&#xff0c;为开发者提供了一个真正意义上的高表现力语音合成方案 —— 它不仅支持多情绪表达&#xff08;如喜悦、愤…

作者头像 李华
网站建设 2026/7/4 13:15:14

LobeChat能否实现AI专利检索?技术创新辅助工具开发

LobeChat能否实现AI专利检索&#xff1f;技术创新辅助工具开发 在当今技术竞争日益激烈的环境下&#xff0c;企业对知识产权的重视程度达到了前所未有的高度。一个研发团队想要快速判断某个技术方向是否已被他人布局&#xff0c;往往需要花费数小时甚至数天时间&#xff0c;在多…

作者头像 李华
网站建设 2026/7/4 2:02:40

vue基于spring boot的乡村民宿预订周边旅游管理系统

目录已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华