由浅入深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其实是把源字符串复制到目的字符串的串尾来实现“连接”的功能。

相关文章
|
6月前
|
C语言
c语言进阶部分详解(经典回调函数qsort()详解及模拟实现)
c语言进阶部分详解(经典回调函数qsort()详解及模拟实现)
72 0
|
3月前
|
关系型数据库 PostgreSQL
【一文搞懂PGSQL】5. 流复制
PostgreSQL流复制架构支持多种常见配置,包括基本的主从复制、结合PGPool-II的读写分离以及使用repmgr实现高可用性。基础环境中,主节点与备用节点分别位于不同IP。配置涵盖创建复制用户、调整核心参数以支持流复制,并确保归档与日志功能正常工作。从节点需通过备份恢复并配置为待机模式,以实现数据同步。此外,还介绍了如何验证复制状态及手动切换主从节点的方法,以及同步复制参数的配置细节。
面试官: 请你手写一份 Call()源码,看完此篇不用担心!
面试官: 请你手写一份 Call()源码,看完此篇不用担心!
字符串的进阶练习案例(接上一节)
字符串的进阶练习案例(接上一节)
49 0
|
存储 开发者
彻底搞懂函数,读这篇文章就够了
如果你之前使用过任何一门编程语言,那么对于你来讲想必已经知道什么是函数,以及如何使用函数了,那你大可不必往下读了。这篇文章是写给新手看的,也就是说我假设你对于函数没有任何的概念。 我们就先从什么是函数来说起吧!
116 0
|
C语言
由浅入深C系列四:memset/memcpy源码分析,为什么这二个函数的目的字符串在前面,源字符串在后面?
memset/memcpy源码分析,为什么这二个函数的目的字符串在前面,源字符串在后面?
|
算法 C++
你是真的“C”——各种实用string类库函数的详细实现过程【上篇】
  哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享你是真的“C”——各种实用string类库函数的详细实现过程。都是精华内容,可不要错过哟!!!😍😍😍
82 0
源于《剑指offer》经典面试题---库函数atoi如何使用及模拟实现
要求如果遇到空格,则根据需要丢弃可能多的空格字符,直到找到第一个非空字符。
88 0
|
编译器 C语言 C++
C++从入门到精通(第七篇) :string类的讲解和模拟实现 (copy)
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。
254 0
C++从入门到精通(第七篇) :string类的讲解和模拟实现 (copy)
memcpy函数使用原则及方法,案例,易错点,,自己制作memcpy
memcpy函数使用原则及方法,案例,易错点,,自己制作memcpy
135 0