模拟实现库函数strcat--将源字符串的副本追加到目标字符串(理解内存重叠问题)

简介: 模拟实现库函数strcat--将源字符串的副本追加到目标字符串(理解内存重叠问题)

一.对库函数strcat的了解



通过在MSDN或者cplusplus网站上检索strcat

16765a50e86a47f68d763d586fc12f43.png


通过对strcat的检索,可以初步了解到strcat以下信息:

1.源头字符串不可被修

2.追加得源头字符串不能和目标重叠

3.追加得字符串来源不能来自目标字符串

4.返回类型是char* 目标地址

5.追加得字符串再目标数组中必须能存放下

6.目标地址得\0会被追加替代,追加后得字符串仍然包括\0


二.模拟实现库函数strcat



char* my_strcat(char* dest, const char* soc)
{
  //记录目标地址起始位置
  char* p = dest;
  //寻找目标地址得\0位置,即追加得起始位置
  while (*dest != '\0')
  {
    dest++;
  }
  //将soc得字符串追加至目标地址中
  while (*dest++ = *soc++)
  {
    ;
  }
  return p;
}
#include<stdio.h>
int main()
{
  char arr1[50] = "abcd";
  char arr2[50] = "efgh";
  char* arr3 = my_strcat(arr1, arr2);
  printf("%s", arr3);
  return 0;
}


三.strcat的一些特殊情况



1.目标地址得\0会被追加替代,追加后得字符串仍然包括\0

f6bb66e4065b4f87a6d8187f32579d84.png


通过调试以后可以发现:

strcat在实现时,虽然会将目标数组的\0替换,但是仍然会在结尾的时候给这个追加的数组补上\0


2.追加得源头字符串不能和目标重叠

下面通过画图来理解重叠的含义:

49cd51cc0b9c4856a4d24a77edd89b97.png



对于这种情况下,源头数据包含在目标数据内。

通过对上面的模拟实现代码的分析:


54270faee7bc407eac2071c45360cf19.png


dest需要先找到\0的位置,然后再将(*dest++)=(*soc++)

对于判断条件while(*dest++ = *soc++),soc一直在向后移动,但是始终找不到\0的位置,无法控制条件停止,最终使程序死循环崩溃


运行结果如下:

315a4593305a49ec8ea818b5c8d74be2.png


另外一种情况:

87fd9a1cb91c4c1694af17b733b8331f.png


这种情况下,目标数据包含在源头数据里。

通过对模拟实现strcat的代码分析:


124dfd5eefbe499e965827218d3980ab.png


同上述第一种情况一样,判断条件中的*soc始终无法找到\0控制条件结束循环,从而导致死循环最终程序崩溃


运行结果如下:

11de0f145c274150af9986c793f2279f.png


相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
9天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
30 6
|
27天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
155 1
|
1月前
|
程序员 C语言
C语言内存函数精讲
C语言内存函数精讲
|
23天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
19 0
|
2月前
|
安全 C++
超级好用的C++实用库之环形内存池
超级好用的C++实用库之环形内存池
45 5
|
1月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
40 0