1. /***
  2. str_copy.c
  3. ***/
  4. #include<stdio.h>
  5.  
  6. void copy_str21(char *from, char *to)
  7. {
  8. for(; *from != '\0'; from++,to++)
  9. {
  10. *to = *from;
  11. }
  12. *to = '\0';
  13.  
  14. return;
  15. }
  16.  
  17. int main()
  18. {
  19. char *from = "abcd";
  20. char buf2[];
  21. copy_str21(from,buf2);
  22. printf("buf2:%s\n",buf2);
  23. return ;
  24. }

程序内存四区分析:

char *from = "abcd";  操作系统在在常量区分配一个内存存放”abcd”,在栈区定义分配一块内存,取名位from,from指向的这块内存存储“abcd”的首地址。

char buf2[100]; 操作系统在栈区分配一块内存,开头与栈区增长方向相反,大小为100个字节

copy_str21(from,buf2);        程序进入到该函数中

void copy_str21(char *from, char *to)        操作系统在继续在栈中分配两块内存,分别用to和from指向这两块内存。并且把mian函数中的from,to地址首部存放在该函数中分配到from,to指针指向的内存

for(; *from != '\0'; from++,to++)

{

*to = *from;

}

copy_str21函数中from指针存储的地址是常量“abcd”的首地址,to指针存储的是mian函数中buf2数组的首地址。然后把from指针不断后移区内容赋值给to指针不断后移所指向的内存空间。

*to = '\0';      由于buf2没有进行初始化,所以最后要在结束的时候把最后面的内存赋值0,作为C语言字符串的结尾。

然后程序返回,copy_str21栈地址回收,主函数打印buf2字符数组。

copy函数技术演练

  1. /***
  2. str_copy.c
  3. ***/
  4. #include<stdio.h>
  5.  
  6. void copy_str21(char *from, char *to)
  7. {
  8. for(; *from != '\0'; from++,to++)
  9. {
  10. *to = *from;
  11. }
  12. *to = '\0';
  13.  
  14. return;
  15. }
  16.  
  17. void copy_str22(char *from,char *to)
  18. {
  19. for(;*from != '\0';)
  20. {
  21. *to++ = *from++;
  22. }
  23. *to = '\0';
  24. return ;
  25. }
  26.  
  27. void copy_str23(char *from,char *to)
  28. {
  29. while( (*to = *from) != '\0')
  30. {
  31. from++;
  32. to++;
  33. }
  34. }
  35.  
  36. void copy_str24(char *from,char *to)
  37. {
  38. while((*to++ = *from++) != '\0')
  39. {
  40. ;
  41. }
  42. }
  43.  
  44. void copy_str25(char *from,char *to)
  45. {
  46. while( (*to++ = *from++) );
  47. }
  48. int main()
  49. {
  50. char *from = "abcd";
  51. char buf1[];
  52. char buf2[];
  53. char buf3[];
  54. char buf4[];
  55. char buf5[];
  56.  
  57. copy_str21(from,buf1);
  58. printf("buf1:%s\n",buf1);
  59. copy_str22(from,buf2);
  60. printf("buf2:%s\n",buf2);
  61. copy_str23(from,buf3);
  62. printf("buf3:%s\n",buf3);
  63. copy_str24(from,buf4);
  64. printf("buf4:%s\n",buf4);
  65. copy_str25(from,buf5);
  66. printf("buf5:%s\n",buf5);
  67. return ;
  68. }

运行结果:

exbot@ubuntu:~/shareWin/CAndC++/20190924$ gcc strcopy.c -o strcopy -g

exbot@ubuntu:~/shareWin/CAndC++/20190924$ ./strcopy

buf1:abcd

buf2:abcd

buf3:abcd

buf4:abcd

buf5:abcd

  1. /***
  2. copy_str.c
  3. ***/
  4. #include<stdio.h>
  5.  
  6. int copy_str26_good(char *from,char *to)
  7. {
  8. if(from == NULL || to == NULL)
  9. {
  10. return -;
  11. }
  12.  
  13. while(*to++ = *from++);
  14.  
  15. return ;
  16. }
  17.  
  18. int copy_str27_verygood(char *from,char *to)
  19. {
  20. if(from == NULL || to == NULL)
  21. {
  22. return -;
  23. }
  24.  
  25. char *tempfrom = from;
  26. char *tempto = to;
  27. while(*tempto++ = *tempfrom++);
  28.  
  29. return ;
  30. }
  31. int main()
  32. {
  33. int ret = ;
  34. char *from = "abcd";
  35. char buf[];
  36. char buf1[];
  37.  
  38. //传进来的指针如果被初始化指向null的话,是不需要被修改的
  39. //因为null和0是操作系统内部一块无法访问和修改的地址空间存储的
  40. //所以提前对传进来的指针进行判断,如果为null,则返回错误
  41. ret = copy_str26_good(from,buf);
  42. if(- == ret)
  43. {
  44. printf("ponit p or buf is null\n");
  45. }
  46. else
  47. {
  48. printf("copy success buf = %s\n",buf);
  49. }
  50.  
  51. //不要轻易改变形参的值,要引入一个辅助的变量指针,把形参接过来
  52. ret = copy_str27_verygood(from,buf1);
  53. if(- == ret)
  54. {
  55. printf("ponit p or buf is null\n");
  56. }
  57. else
  58. {
  59. printf("copy success buf1 = %s\n",buf1);
  60. }
  61. return ;
  62. }

运行结果:

exbot@ubuntu:~/shareWin/CAndC++/20190924$ ./copy_str

copy success buf = abcd

copy success buf1 = abcd

copy()函数技术推演的更多相关文章

  1. C语言 数组做函数参数退化为指针的技术推演

    //数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组 ...

  2. Redux 实现过程的推演

    这是一篇浅入浅出的 Redux 实现过程的推演笔记!正常来说应该是要从源码下手开始解析,这里是逆向推演,假如有需求是要这么一个东西,那么该如何从零开始实现? 通过该笔记,更多的是希望自己能够多熟悉从无 ...

  3. 从匿名方法到 Lambda 表达式的推演过程

    Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. 以上是msdn官网对Lambda 表达式 ...

  4. javascript基础修炼(4)——UMD规范的代码推演

    javascript基础修炼(4)--UMD规范的代码推演 1. UMD规范 地址:https://github.com/umdjs/umd UMD规范,就是所有规范里长得最丑的那个,没有之一!!!它 ...

  5. Excel催化剂开源第11波-动态数组函数技术开源及要点讲述

    在Excel催化剂中,大量的自定义函数使用了动态数组函数效果,虽然不是原生的Excel365版效果(听说Excel2019版取消了支持动态数组函数,还没求证到位,Excel365是可以用,但也仅限于部 ...

  6. 从下往上看--新皮层资料的读后感 第三部分 70年前的逆向推演- 从NN到ANN

    第三部分 NN-ANN 70年前的逆向推演 从这部分开始,调整一下视角主要学习神经网络算法,将其与生物神经网络进行横向的比较,以窥探一二. 现在基于NN的AI应用几乎是满地都是,效果也不错,这种貌似神 ...

  7. php不使用copy()函数复制文件的方法

    本文实例讲述了php不使用copy()函数复制文件的方法.分享给大家供大家参考.具体如下:下面的代码不使用php内置的copy函数,直接通过文件读取写入的操作方式复制文件 <?php funct ...

  8. 利用copy函数简单快速输出/保存vector向量容器中的数据

    如果要输出vector中的数据我们可以通过循环语句输出,更加简便的方法是利用copy函数直接输出,例子: #include "stdafx.h" #include <iost ...

  9. 使用copy函数完成数据库迁移

    最近在该一个迁移工具的迁移方式,从ora8迁移到postgresql使用原来的插入迁移速度太慢了,老板说让使用缓存迁移,即使用postgresql的copy函数,因此去pg官网查阅了相关资料,我们需要 ...

随机推荐

  1. AspNetCore网关集成Swagger访问使用IdentityServer保护的webapi项目

    创建webapi项目 创建四个webapi项目,两个处理业务,一个网关,一个验证中心.四个项目对应的端口如下, ApiGateway:1999 IdentityServer:16690 Service ...

  2. [unity]GPU Instance学习

    前言我们之前研究过为什么Unity的UI可以合批,是因为使用了相同的材质进行渲染,UI上不同图片渲染是通过把图片打成一张图集后,使用Image组件对顶点填充了不同的UV值实现的.那么有没有什么办法可以 ...

  3. Windows10如何卸载OneDrive

    Windows10如何卸载OneDrive 来源 https://zhuanlan.zhihu.com/p/23985905 1) 禁止onedrive自启动简单的就是在任务管理器的启动中禁用oned ...

  4. 浅谈对BFC的认识,以及用bfc解决浮动问题

    我们在前端的学习过程中常常会遇到BFC,用BFC来解决一些margin塌陷.margin合并清理浮动流的问题 那么问题来了,我们所说的BFC到底是个什么东西呢: 什么是BFC BFC(Block Fo ...

  5. JSP中Get提交方式的中文乱码解决

    最近对JSP&Servlert的原理很感兴趣,所以今天花时间看了一下:无奈在一个编码问题上困扰很久 这是我的解决思路: (1)检查网页(html/jsp)页面的编码: (2)检查服务器端的处理 ...

  6. Redis 学习-Redis 的其他功能

    一.慢查询 找到 系统中瓶颈的命令 1. 客户端请求的生命周期: ①. 慢查询通常发生在第三阶段. ②. 客户端超时不一定是慢查询,但慢查询是客户端超时的一个可能因素. 2. 相关配置 慢查询命令会存 ...

  7. 浅谈 form 表单提交

    原创文章,转载请注明出处:http://www.cnblogs.com/weix-l/p/7675230.html 若有错误,请评论指出,谢谢! Form 对象代表一个 HTML 表单.在 HTML ...

  8. 【MySQL】SQL语句基础

    一.操作数据库 1.1 创建数据库 1.2 查看数据库 1.3 修改数据库 1.4 删除数据库 1.5 选择数据库 二.操作表 2.1 创建表 2.2 查看表 2.3 修改表 2.4 删除表 三.操作 ...

  9. 过滤器实现Token验证(登录验证+过期验证)---简单的实现

    功能:登录验证+过期验证+注销清除cookie+未注销下关闭或刷新浏览器仍可直接访问action概述:token只存在客户端cookie,后端AES加密+解密+验证,每一次成功访问action都会刷新 ...

  10. p3.BTC-协议

    数字货币是文件,难伪造,但是容易复制,不像实体货币,花出去就没了,数字货币存在double spending attack,双花攻击. 去中心化的货币,需要解决两个问题: 1.货币的发行 挖矿 2.交 ...