由浅入深C系列三:strcat函数源码分析,到底是连接,还是复制?

简介: strcat函数源码分析,到底是连接,还是复制?

困惑起源

最近在review一段功能代码,看到如下一段。对于strcat部分,在调用后即进行了free操作,会不会有问题,strcat不是把字符串连接上去么?

char* all_field_name = (char*)malloc(sizeof(char)*1024);
memset(all_field_name, 0, 1024);
// ... 省略部分
while (myfields = sql_fetch_field(my_res)) 
{
    char* field_name = (char*)malloc(sizeof(char)*(strlen(myfields->name)+4));
    sprintf(field_name, "| %s ", myfields->name);
    strcat(all_field_name, field_name);
    free(field_name);
}
free(all_field_name)

读源码,解困惑

解决困惑的最好办法,就是查看源代码,看看这个常用库函数到底是怎么操作的。以下代码来源于\linux-6.1-rc1\lib\string.c

#ifndef __HAVE_ARCH_STRCAT
/**
 * strcat - Append one %NUL-terminated string to another
 * @dest: The string to be appended to
 * @src: The string to append to it
 */
char *strcat(char *dest, const char *src)
{
    char *tmp = dest;

    while (*dest)
        dest++;
    while ((*dest++ = *src++) != '\0')
        ;
    return tmp;
}
EXPORT_SYMBOL(strcat);
#endif

通过这段代码走读,函数主要的实现步骤如下:
1、函数实现代码的第一行声明了一个很重要的 tmp指针,保留目的字符串的起始地址。接着就可以放心的使用dest,dest要一直指向目的字符串的串尾,才能保证后面把源串连接过来。
2、接着通过一个循环,找到了目的字符串的串尾,即以\0结尾的位置。这个也提醒我们,如果要执行字符串连接,以\0结尾很重要,否则会coredump。
3、将源字符串一个一个的copy了过来。并不是将源字符串直接连接到目的字符串的串尾。

结论

到这里,就比较清楚的看出来,strcat其实是把源字符串复制到目的字符串的串尾来实现“连接”的功能。

相关文章
|
2月前
|
存储 监控 开发工具
阿里云日志服务SLS全流程对接与深度使用指南
本文是一篇详尽的阿里云日志服务SLS技术科普文章,从核心概念、服务开通、资源创建、数据采集、SDK集成、查询分析、可视化告警、安全权限到成本优化,全面讲解SLS的对接与使用。文章包含Logtail采集、Python/Java SDK代码示例、SPL与SQL查询等实操内容,帮助用户从零构建企业级日志管理平台,实现日志的统一归集、实时分析与智能运维。
|
4月前
|
人工智能 移动开发 API
阿里云最新域名活动信息:域名注册、转入活动及续费优惠口令分享
2026年阿里云推出域名优惠活动,涵盖注册、续费、转入三大场景:注册方面提供.cn低至19元、.com首年35元(需满足关联域名注册条件)、.net首年39元(需关联.com域名)等特价,新用户可享15元AI建站套餐含云资源及赠送.CN域名;续费环节通过专属优惠口令实现减免,口令涵盖com/cn/xin等后缀的续费场景;转入服务每周三提供阶梯折扣,单笔订单转入5个及以上.com域名仅需78元。活动通过批量注册包、关联域名优惠等形式,结合AI建站套餐赠送域名等组合策略,全面降低用户域名使用成本。
|
人工智能 PyTorch 算法框架/工具
AI 容器镜像部署 Stable Diffusion
本文将基于阿里云 AMD 服务器和龙蜥 AI 容器服务,快速搭建出个人版文生图服务
|
存储 弹性计算 运维
阿里云经济型e系列云服务器测评,专为中小应用打造
2023年9月,阿里云推出了一款全新云服务器实例,经济型e实例,基于“飞天+CIPU”黄金技术架构设计,可轻松满足网站建设、开发测试和小型应用构建等场景需求,使用成本最低可降至每天0.5元,告别复杂的选型和高昂的成本,进一步降低了学生群体、个人开发者和小微企业的上云门槛。
3063 0
阿里云经济型e系列云服务器测评,专为中小应用打造
|
缓存 编译器 程序员
【Qt 元对象系统04】 深入浅出Qt的QMetaObject:探索元对象的魔法
【Qt 元对象系统04】 深入浅出Qt的QMetaObject:探索元对象的魔法
1613 0
阿里云账号注册、云服务器购买、域名备案流程(图文详细教程)
本文详细介绍了2025年阿里云域名备案的全流程,包括注册阿里云账号、企业实名认证、购买服务器、创建域名信息模板、购买域名、域名备案及查询备案号等步骤。通过图文结合的方式,清晰展示了每个环节的操作方法和注意事项,帮助用户顺利完成域名备案。文章强调了域名备案的前提是国内需有一台服务器,并提供了具体配置建议,同时提醒用户注意邮箱验证和短信核验等关键步骤,确保备案顺利通过。
|
数据可视化 JavaScript 图形学
实时云渲染将UE像素流嵌入业务系统,实现二维管理系统与数字孪生三维可视化程序的无缝交互
实时云渲染将UE开发的数字孪生三维可视化场景,一键嵌入智慧大脑等业务系统,用户在执行业务操作时,二维图表与三维可视化场景实时交互,通过WebSDK和数据通道等方式,实现丰富的二次开发功能,无缝对接园区、管网、城市、BIM/CIM等管理平台,适合于石油石化、安监安防、能源电力、冶金冶炼、航空航天、机场航务等各类数字孪生行业场景。
620 157
|
12月前
|
Ubuntu Linux
Ubuntu Linux 20.04 LTS “Focal Fossa”测试版开放下载
u要知道有关新系统的更多信息,大家可以前往Ubuntu Wiki页面,其中包含Ubuntu 20.04的发行说明。
284 0
|
运维 Ubuntu Linux
Linux重置root用户密码
本文详细介绍了Linux系统中root密码重置的核心技能,涵盖主流发行版如RHEL、CentOS、Debian、Ubuntu、Arch、openSUSE等的实操方法。内容包括通过GRUB引导编辑、单用户模式和Live CD救援三种方式重置密码的具体步骤,适配物理机、虚拟机及云服务器环境。文章分步解析了启动拦截、权限获取和密码重置三大阶段,并提供各发行版的实际操作代码示例,帮助管理员快速解决忘记root密码的问题。