news 2026/5/19 7:31:52

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

作者头像

张小明

前端开发工程师

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/5/18 10:49:10

Kotaemon:基于Gradio的RAG文档对话工具安装与配置

Kotaemon&#xff1a;基于Gradio的RAG文档对话工具安装与配置 在企业知识管理日益复杂的今天&#xff0c;如何让AI真正“读懂”内部文档&#xff0c;并以自然语言准确作答&#xff0c;成为智能客服、知识助手等场景的核心挑战。传统的问答系统常因信息孤岛或上下文缺失而表现不…

作者头像 李华
网站建设 2026/5/18 18:57:45

基于Android的大学生校园互帮APP的设计与实现(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦大学生校园内需求匹配低效、互助渠道单一的痛点&#xff0c;设计实现基于 Android 的大学生校园互帮 APP。系统以 Java 为核心开发语言&#xff0c;基于 Android 原生框架搭建移动端应用&#xff0c;搭配轻量后端服务架构&#xff0c;处理需求发布、技能匹配…

作者头像 李华
网站建设 2026/5/18 10:47:53

LobeChat:全栈开发现代化AI聊天应用

LobeChat&#xff1a;构建现代 AI 聊天应用的全栈实践 在生成式 AI 浪潮席卷各行各业的今天&#xff0c;一个直观、灵活且可定制的对话界面&#xff0c;已成为连接用户与大模型能力的关键入口。然而&#xff0c;从零开发一套稳定、美观、功能完整的 AI 聊天系统——支持多模型切…

作者头像 李华
网站建设 2026/5/17 8:50:42

LobeChat能否取代官方ChatGPT客户端?对比评测来了

LobeChat能否取代官方ChatGPT客户端&#xff1f;对比评测来了 在企业越来越依赖大模型构建智能系统、开发者渴望更自由AI交互入口的今天&#xff0c;一个开源项目正悄然改变游戏规则——LobeChat。它不再只是“另一个聊天界面”&#xff0c;而是试图成为连接人与多模态AI能力的…

作者头像 李华
网站建设 2026/5/19 1:42:10

vue基于Springboot框架的大学生就业服务平台四个角色sdae9ber

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

作者头像 李华
网站建设 2026/5/13 7:38:36

从项目协调到AI协作者:一段关于认证学习的个人思考

两年多前&#xff0c;在组织一场数字化转型研讨会时&#xff0c;我注意到一个现象&#xff1a;业务部门谈论的“智能化需求”与技术团队回应的“实现条件”之间&#xff0c;常存在理解上的间隙。作为当时的项目协调者&#xff0c;我既能听懂业务方的期待&#xff0c;也能理解技…

作者头像 李华