news 2026/4/23 16:19:48

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

作者头像

张小明

前端开发工程师

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/4/23 13:38:15

LobeChat能否支持RSS订阅?资讯聚合AI推送服务

LobeChat 与 RSS&#xff1a;构建智能资讯聚合的实践路径 在信息爆炸的时代&#xff0c;我们每天被成千上万条新闻、博客和论文包围。尽管获取信息变得前所未有的容易&#xff0c;但“读不过来”反而成了新的瓶颈。你有没有过这样的经历&#xff1f;收藏夹里堆满了未读文章&…

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

设备管理必备:USB ID 查询站点推荐

USB设备识别利器&#xff1a;从VID:PID到精准定位 你有没有遇到过这样的情况&#xff1f;插入一个USB摄像头&#xff0c;系统却只提示“未知设备”&#xff1b;或者在批量部署终端时&#xff0c;发现某些U盘根本无法被识别。这时候&#xff0c;那串看似无意义的 1a2b:3c4d 编码…

作者头像 李华
网站建设 2026/4/23 9:24:11

Docker安装TensorRT镜像并运行大模型的完整教程

Docker安装TensorRT镜像并运行大模型的完整实践 在AI应用从实验室走向生产线的过程中&#xff0c;一个常见的尴尬场景是&#xff1a;模型在开发环境能跑通&#xff0c;一到生产环境就卡顿、延迟飙升甚至显存溢出。尤其是在视频分析、语音交互或大语言模型服务这类对响应速度极为…

作者头像 李华
网站建设 2026/4/23 9:22:48

91n实操:使用TensorRT部署LLaMA-2-7B模型

使用TensorRT部署LLaMA-2-7B模型&#xff1a;从理论到实操的完整路径 在当前大语言模型&#xff08;LLM&#xff09;快速演进的背景下&#xff0c;推理效率已成为决定模型能否真正落地的关键。尽管像 LLaMA-2-7B 这样的70亿参数模型展现出强大的语义理解与文本生成能力&#xf…

作者头像 李华
网站建设 2026/4/23 9:24:14

LobeChat能否支持AR导航?室内定位与语音指引融合

LobeChat能否支持AR导航&#xff1f;室内定位与语音指引融合 在医院迷宫般的走廊里&#xff0c;一位初次就诊的老人掏出手机扫码打开网页&#xff0c;轻声说&#xff1a;“带我去心内科。”下一秒&#xff0c;他的手机屏幕上浮现出一条发光的虚拟路径&#xff0c;叠加在真实的走…

作者头像 李华
网站建设 2026/4/23 7:53:03

使用conda创建独立环境安装PaddlePaddle避免依赖冲突

使用 Conda 创建独立环境安装 PaddlePaddle 避免依赖冲突 在现代 AI 开发中&#xff0c;一个看似不起眼却频繁“踩坑”的问题浮出水面&#xff1a;不同项目之间因深度学习框架版本不兼容而导致的依赖冲突。你是否曾遇到过这样的场景&#xff1f;刚跑通一个基于 PaddleOCR 的文…

作者头像 李华