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

相关文章
|
8月前
|
C语言
c语言进阶部分详解(经典回调函数qsort()详解及模拟实现)
c语言进阶部分详解(经典回调函数qsort()详解及模拟实现)
75 0
|
5月前
|
Web App开发 JavaScript 前端开发
JS:类型转换(二)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
JS:类型转换(二)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
|
5月前
|
JavaScript 前端开发
JS:类型转换(三)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
JS:类型转换(三)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
|
5月前
|
JavaScript 前端开发
JS:类型转换(四)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
JS:类型转换(四)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
|
5月前
|
JavaScript 前端开发
JS:类型转换(一)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
JS:类型转换(一)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
|
8月前
|
算法 编译器 C++
【C++ 函数 基本教程 第二篇 】深度剖析C++:作用域与函数查找机制
【C++ 函数 基本教程 第二篇 】深度剖析C++:作用域与函数查找机制
76 0
|
8月前
|
前端开发 数据处理
【前端学习】—多种方式实现数组拍平(十一)
【前端学习】—多种方式实现数组拍平(十一)
字符串的进阶练习案例(接上一节)
字符串的进阶练习案例(接上一节)
55 0
|
存储 编译器 C语言
【C】函数真的难嘛?其实一点也不难,原理很简单。
# 什么是函数 程序是由多个零件组合而成的,而函数就是这种“零件”的一个较小单位。 ## main函数和库函数 C语言程序中,main函数是必不可少的。程序运行的时候,会执行main函数的主题部分。main函数中使用了printf、scanf、puts等函数。由C语言提供的这些为数众多的函数称为库函数。 ## 什么是函数 当然,我们也可以自己创建函数。而实际上,我们也必须亲自动手创建各种函数。下面我们来自己创建一个简单的函数。 创建一个函数,接收两个整数参数,返回较大整数的值。 printf函数和scanf函数等创建得比较好得函数,即使不知道其内容,只要了解使用方法,也可以轻松使用。 ## 函
【C知识点】函数地址
【C知识点】函数地址
93 0