news 2026/6/11 0:11:22

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

作者头像

张小明

前端开发工程师

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/6/10 12:49:52

本地部署Qwen3-8b大模型完整指南

本地部署 Qwen3-8B 大模型完整指南 在当前生成式 AI 快速发展的浪潮中&#xff0c;越来越多开发者不再满足于调用云端 API&#xff0c;而是希望将大模型真正“握在手中”——既能保障数据隐私&#xff0c;又能深度定制和优化推理流程。阿里云推出的 Qwen3-8B 正是这一趋势下的…

作者头像 李华
网站建设 2026/6/10 12:51:18

告别幻觉:知识库的三种结构,如何决定大模型客服的天花板?

当企业满怀期待地部署了大模型客服机器人后&#xff0c;却常常遭遇这样的尴尬&#xff1a;机器人要么对最新的产品政策一问三不知&#xff0c;要么在复杂的业务咨询中“信口开河”。究其根本&#xff0c;问题往往不在于大模型本身的能力&#xff0c;而在于其赖以生存的“粮仓”…

作者头像 李华
网站建设 2026/6/10 12:53:26

LobeChat能否实现暗黑模式切换?夜间使用体验优化

LobeChat 能否实现暗黑模式切换&#xff1f;夜间使用体验优化 在深夜的书桌前&#xff0c;你正与 AI 助手进行一场深入对话——撰写报告、调试代码、或是规划项目。屏幕是唯一的光源&#xff0c;而刺眼的白色背景却让眼睛逐渐酸涩。这种场景下&#xff0c;一个简单的“暗黑模式…

作者头像 李华
网站建设 2026/6/10 14:53:01

基于Android的掌上医疗APP的设计与实现(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦患者就医流程繁琐、医疗信息获取不及时、医患沟通效率低的痛点&#xff0c;设计实现基于 Android 的掌上医疗 APP。系统以 Java 为核心开发语言&#xff0c;基于 Android 原生框架搭建移动端应用&#xff0c;搭配后端医疗级服务架构&#xff0c;处理在线挂号…

作者头像 李华
网站建设 2026/6/9 19:43:42

基于Android的艺术文化交流平台的设计与实现(源码+lw+部署文档+讲解等)

课题介绍 本课题聚焦艺术文化爱好者交流渠道分散、作品展示形式单一、资源共享不足的痛点&#xff0c;设计实现基于 Android 的艺术文化交流平台。系统以 Java 为核心开发语言&#xff0c;基于 Android 原生框架搭建移动端应用&#xff0c;搭配轻量后端服务架构&#xff0c;处理…

作者头像 李华
网站建设 2026/6/10 14:54:33

GitHub项目GPT-SoVITS Star增长背后的商业价值

GPT-SoVITS&#xff1a;从技术突破到商业潜力的语音合成新范式 在内容创作日益个性化的今天&#xff0c;你是否曾想过——只需一分钟录音&#xff0c;就能让AI用你的声音朗读任意文字&#xff1f;这不再是科幻电影中的桥段&#xff0c;而是GPT-SoVITS正在实现的现实。 这个Gi…

作者头像 李华