copy()函数技术推演
- /***
- str_copy.c
- ***/
- #include<stdio.h>
- void copy_str21(char *from, char *to)
- {
- for(; *from != '\0'; from++,to++)
- {
- *to = *from;
- }
- *to = '\0';
- return;
- }
- int main()
- {
- char *from = "abcd";
- char buf2[];
- copy_str21(from,buf2);
- printf("buf2:%s\n",buf2);
- return ;
- }
程序内存四区分析:
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函数技术演练
- /***
- str_copy.c
- ***/
- #include<stdio.h>
- void copy_str21(char *from, char *to)
- {
- for(; *from != '\0'; from++,to++)
- {
- *to = *from;
- }
- *to = '\0';
- return;
- }
- void copy_str22(char *from,char *to)
- {
- for(;*from != '\0';)
- {
- *to++ = *from++;
- }
- *to = '\0';
- return ;
- }
- void copy_str23(char *from,char *to)
- {
- while( (*to = *from) != '\0')
- {
- from++;
- to++;
- }
- }
- void copy_str24(char *from,char *to)
- {
- while((*to++ = *from++) != '\0')
- {
- ;
- }
- }
- void copy_str25(char *from,char *to)
- {
- while( (*to++ = *from++) );
- }
- int main()
- {
- char *from = "abcd";
- char buf1[];
- char buf2[];
- char buf3[];
- char buf4[];
- char buf5[];
- copy_str21(from,buf1);
- printf("buf1:%s\n",buf1);
- copy_str22(from,buf2);
- printf("buf2:%s\n",buf2);
- copy_str23(from,buf3);
- printf("buf3:%s\n",buf3);
- copy_str24(from,buf4);
- printf("buf4:%s\n",buf4);
- copy_str25(from,buf5);
- printf("buf5:%s\n",buf5);
- return ;
- }
运行结果:
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
- /***
- copy_str.c
- ***/
- #include<stdio.h>
- int copy_str26_good(char *from,char *to)
- {
- if(from == NULL || to == NULL)
- {
- return -;
- }
- while(*to++ = *from++);
- return ;
- }
- int copy_str27_verygood(char *from,char *to)
- {
- if(from == NULL || to == NULL)
- {
- return -;
- }
- char *tempfrom = from;
- char *tempto = to;
- while(*tempto++ = *tempfrom++);
- return ;
- }
- int main()
- {
- int ret = ;
- char *from = "abcd";
- char buf[];
- char buf1[];
- //传进来的指针如果被初始化指向null的话,是不需要被修改的
- //因为null和0是操作系统内部一块无法访问和修改的地址空间存储的
- //所以提前对传进来的指针进行判断,如果为null,则返回错误
- ret = copy_str26_good(from,buf);
- if(- == ret)
- {
- printf("ponit p or buf is null\n");
- }
- else
- {
- printf("copy success buf = %s\n",buf);
- }
- //不要轻易改变形参的值,要引入一个辅助的变量指针,把形参接过来
- ret = copy_str27_verygood(from,buf1);
- if(- == ret)
- {
- printf("ponit p or buf is null\n");
- }
- else
- {
- printf("copy success buf1 = %s\n",buf1);
- }
- return ;
- }
运行结果:
exbot@ubuntu:~/shareWin/CAndC++/20190924$ ./copy_str
copy success buf = abcd
copy success buf1 = abcd
copy()函数技术推演的更多相关文章
- C语言 数组做函数参数退化为指针的技术推演
//数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组 ...
- Redux 实现过程的推演
这是一篇浅入浅出的 Redux 实现过程的推演笔记!正常来说应该是要从源码下手开始解析,这里是逆向推演,假如有需求是要这么一个东西,那么该如何从零开始实现? 通过该笔记,更多的是希望自己能够多熟悉从无 ...
- 从匿名方法到 Lambda 表达式的推演过程
Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. 以上是msdn官网对Lambda 表达式 ...
- javascript基础修炼(4)——UMD规范的代码推演
javascript基础修炼(4)--UMD规范的代码推演 1. UMD规范 地址:https://github.com/umdjs/umd UMD规范,就是所有规范里长得最丑的那个,没有之一!!!它 ...
- Excel催化剂开源第11波-动态数组函数技术开源及要点讲述
在Excel催化剂中,大量的自定义函数使用了动态数组函数效果,虽然不是原生的Excel365版效果(听说Excel2019版取消了支持动态数组函数,还没求证到位,Excel365是可以用,但也仅限于部 ...
- 从下往上看--新皮层资料的读后感 第三部分 70年前的逆向推演- 从NN到ANN
第三部分 NN-ANN 70年前的逆向推演 从这部分开始,调整一下视角主要学习神经网络算法,将其与生物神经网络进行横向的比较,以窥探一二. 现在基于NN的AI应用几乎是满地都是,效果也不错,这种貌似神 ...
- php不使用copy()函数复制文件的方法
本文实例讲述了php不使用copy()函数复制文件的方法.分享给大家供大家参考.具体如下:下面的代码不使用php内置的copy函数,直接通过文件读取写入的操作方式复制文件 <?php funct ...
- 利用copy函数简单快速输出/保存vector向量容器中的数据
如果要输出vector中的数据我们可以通过循环语句输出,更加简便的方法是利用copy函数直接输出,例子: #include "stdafx.h" #include <iost ...
- 使用copy函数完成数据库迁移
最近在该一个迁移工具的迁移方式,从ora8迁移到postgresql使用原来的插入迁移速度太慢了,老板说让使用缓存迁移,即使用postgresql的copy函数,因此去pg官网查阅了相关资料,我们需要 ...
随机推荐
- AspNetCore网关集成Swagger访问使用IdentityServer保护的webapi项目
创建webapi项目 创建四个webapi项目,两个处理业务,一个网关,一个验证中心.四个项目对应的端口如下, ApiGateway:1999 IdentityServer:16690 Service ...
- [unity]GPU Instance学习
前言我们之前研究过为什么Unity的UI可以合批,是因为使用了相同的材质进行渲染,UI上不同图片渲染是通过把图片打成一张图集后,使用Image组件对顶点填充了不同的UV值实现的.那么有没有什么办法可以 ...
- Windows10如何卸载OneDrive
Windows10如何卸载OneDrive 来源 https://zhuanlan.zhihu.com/p/23985905 1) 禁止onedrive自启动简单的就是在任务管理器的启动中禁用oned ...
- 浅谈对BFC的认识,以及用bfc解决浮动问题
我们在前端的学习过程中常常会遇到BFC,用BFC来解决一些margin塌陷.margin合并清理浮动流的问题 那么问题来了,我们所说的BFC到底是个什么东西呢: 什么是BFC BFC(Block Fo ...
- JSP中Get提交方式的中文乱码解决
最近对JSP&Servlert的原理很感兴趣,所以今天花时间看了一下:无奈在一个编码问题上困扰很久 这是我的解决思路: (1)检查网页(html/jsp)页面的编码: (2)检查服务器端的处理 ...
- Redis 学习-Redis 的其他功能
一.慢查询 找到 系统中瓶颈的命令 1. 客户端请求的生命周期: ①. 慢查询通常发生在第三阶段. ②. 客户端超时不一定是慢查询,但慢查询是客户端超时的一个可能因素. 2. 相关配置 慢查询命令会存 ...
- 浅谈 form 表单提交
原创文章,转载请注明出处:http://www.cnblogs.com/weix-l/p/7675230.html 若有错误,请评论指出,谢谢! Form 对象代表一个 HTML 表单.在 HTML ...
- 【MySQL】SQL语句基础
一.操作数据库 1.1 创建数据库 1.2 查看数据库 1.3 修改数据库 1.4 删除数据库 1.5 选择数据库 二.操作表 2.1 创建表 2.2 查看表 2.3 修改表 2.4 删除表 三.操作 ...
- 过滤器实现Token验证(登录验证+过期验证)---简单的实现
功能:登录验证+过期验证+注销清除cookie+未注销下关闭或刷新浏览器仍可直接访问action概述:token只存在客户端cookie,后端AES加密+解密+验证,每一次成功访问action都会刷新 ...
- p3.BTC-协议
数字货币是文件,难伪造,但是容易复制,不像实体货币,花出去就没了,数字货币存在double spending attack,双花攻击. 去中心化的货币,需要解决两个问题: 1.货币的发行 挖矿 2.交 ...