03 2014 档案

udphdr结构
摘要:udphdr结构包含在/usr/src/linux/include/linux/udp.h1 struct udphdr {2 __u16 source;3 __u16 dest;4 __u16 len;5 __u16 check;6 }; |----------------|----------------|------------- | source | dest | |----------------|----------------| | len|check| |--------------------------... 阅读全文

posted @ 2014-03-24 14:55 程良 阅读(1967) 评论(0) 推荐(0) 编辑

常见递归&非递归实现
摘要:void my_strcpy(char *to,const char *from){ if('\0' == *from){ *to = '\0'; return ; } *to++ = *from++; my_strcpy(to,from);}//只拷贝n个字符void my_strncpy(char *to,const char* from,int n){ if( 0 == n || '\0' == *from){ *to = '\0'; return ; } *to++ = *from++; ... 阅读全文

posted @ 2014-03-22 21:48 程良 阅读(464) 评论(0) 推荐(0) 编辑

tcphdr结构
摘要:包含在/usr/src/linux/include/linux/tcp.h 1 struct tcphdr { 2 __be16 source; 3 __be16 dest; 4 __be32 seq; 5 __be32 ack_seq; 6 #if defined(__LITTLE_ENDIAN_BITFIELD) 7 __u16 res1:4, 8 doff:4, 9 fin:1,10 syn:1,11 rst:1,12 psh... 阅读全文

posted @ 2014-03-22 20:40 程良 阅读(5301) 评论(0) 推荐(0) 编辑

iphdr结构
摘要:包含在/usr/src/linux/include/linux/ip.h 1 struct iphdr { 2 #if defined(__LITTLE_ENDIAN_BITFIELD) 3 __u8 ihl:4, 4 version:4; 5 #elif defined (__BIG_ENDIAN_BITFIELD) 6 __u8 version:4, 7 ihl:4; 8 #else 9 #error "Please fix "10 #endif11 __u8 tos;12 __be16 ... 阅读全文

posted @ 2014-03-21 16:58 程良 阅读(1087) 评论(0) 推荐(0) 编辑

IP选路
摘要:选路是IP最重要的功能之一。图1是IP层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生,也可以由其他主机产生。在后一种情况下,主机必须配置成一个路由器,否则通过网络接口接收到的数据报,如果目的地址不是本机就要被丢弃。图1:IP层工作流程图1中的路由表经常被IP访问(在一个繁忙的主机上,一秒钟内可能要访问几百次),但是它被路由守护程序等更新的频度却要低得多(可能大约30秒一次)。选路的原理IP搜索路由表的几个步骤: 1)搜索匹配的主机地址; 2)搜索匹配的网络地址; 3)搜索默认表项(默认表项一般在路由表中被指定为一个网络表项,其网络号为0)。匹配主机地址步骤始终发生在匹配网... 阅读全文

posted @ 2014-03-20 19:35 程良 阅读(695) 评论(0) 推荐(0) 编辑

ping命令
摘要:Ping命令是对两个TCP/IP系统连通性进行测试的基本工具,目的是为了测试目标主机是否可达。它利用ICMP回显请求(8,0)和回显应答(0,0)报文,而不用经过传输层(TCP/UDP)。Ping服务器一般在内核中实现ICMP的功能,Ping只有在安装了TCP/IP协议以后才可以使用。Ping命令结构我们称发送回显请求的Ping程序为客户,被Ping的主机为服务器。ICMP回显请求和回显应答报文:Ping命令的类型值为8或0,代码值为0。标识符:Unix系统在实现Ping程序时把ICMP报文中的标识符字段设置成发送进程的ID号。这样可以区分多个Ping实例。序列号:从0开始,每发送一次新的回显 阅读全文

posted @ 2014-03-20 19:14 程良 阅读(1517) 评论(0) 推荐(0) 编辑

动态选路协议
摘要:http://www.cppblog.com/aurain/archive/2008/08/21/59542.html 阅读全文

posted @ 2014-03-20 16:41 程良 阅读(101) 评论(0) 推荐(0) 编辑

linux下C编程初篇
摘要:对于程序设计员来说,makefile是我们绕不过去的一个坎。可能对于习惯Visual C++的用户来说,是否会编写makefile无所谓。毕竟工具本身已经帮我们做好了全部的编译流程。但是在Linux上面,一切变得不一样了,没有人会为你做这一切。编代码要靠你,测试要靠你,最后自动化编译设计也要靠你自己。想想看,如果你下载了一个开源软件,却因为自动化编译失败,那将会在很大程度上打击你学习代码的自信心了。所以,我的理解是这样的。我们要学会编写makefile,至少会编写最简单的makefile。 首先编写add.c文件,#include "test.h" #include int 阅读全文

posted @ 2014-03-18 22:26 程良 阅读(193) 评论(0) 推荐(0) 编辑

linux & windows下的动态库制作
摘要:动态链接库不是linux独有的特性,在windows下面也存在这样的特性。一般来说,windows下面的动态连接库是以*.dll作为结尾的,而linux下面的动态连接库是以*.so结尾的。和静态链接库相比,动态连接库可以共享内存资源,这样可以减少内存消耗。另外,动态连接是需要经过操作系统加载器的帮助才能被普通执行文件发现的,所以动态连接库可以减少链接的次数。有了这个特点,我们就不难发现为什么很多软件的补丁其实都是以动态库发布的。 那么,在Linux上动态库是怎么生成的呢?#include "test.h" int add(int a, int b) { return a.. 阅读全文

posted @ 2014-03-18 22:24 程良 阅读(429) 评论(0) 推荐(0) 编辑

linux下静态库的制作
摘要:在我们编写软件的过程当中,少不了需要使用别人的库函数。因为大家知道,软件是一个协作的工程。作为个人来讲,你不可能一个人完成所有的工作。另外,网络上一些优秀的开源库已经被业内广泛接受,我们也没有必要把时间浪费在这些重复的工作上面。 既然说到了库函数,那么一般来说库函数分为两种方式:静态库和动态库。两者的区别其实很小,静态库是必须要链接到执行文件中去的,而动态库是不需要链接到最后的执行文件中的。怎么理解呢?也就是说,对于最后的执行文件而言,你是否删除静态库无所谓。但是,一旦你删除了动态库,最后的执行文件就玩不转了。 今天我们讨论的问题是静态库。为了显示windows和linux创建静态库之... 阅读全文

posted @ 2014-03-18 22:23 程良 阅读(415) 评论(0) 推荐(0) 编辑

ICMP协议
摘要:1 // ICMP header 2 typedef struct _tagX_icmphdr 3 { 4 unsigned char i_type; //类型 5 unsigned char i_code; //代码 6 unsigned short i_cksum; //检验和 7 unsigned short i_id; //标识符 8 unsigned short i_seq; //序列号 9 unsigned long i_timestamp;//当前时间 =(unsigned long)::GetTick... 阅读全文

posted @ 2014-03-15 17:06 程良 阅读(2372) 评论(0) 推荐(0) 编辑

ARP:地址解析协议
摘要:我们假设这样一个场景:你需要和你网络中的一个设备进行通信,这个设备可能是某种服务器。你用来创建这个通信的应用已经得到了这个远程主机的ip地址,也意味着系统已经有了用来构建它想要在第三层到第7层传递数据包所需要的信息。这时它所需要的唯一的信息就是第二层包含目标主机MAC地址的数据链路层数据。之所以需要MAC地址,是因为网络中用于连接各个设备的交换机使用了内容寻址寄存器(CAM),这个表列出了它在每一个端口所有连接设备的MAC地址。当交换机收到了一个指定MAC地址的流量,它会使用这个表,来确定应该使用哪个端口发送流量。如果目标的MAC地址是未知的,这个传输设备会首先在它的缓存中查询这个非地址,如果 阅读全文

posted @ 2014-03-15 11:09 程良 阅读(452) 评论(0) 推荐(0) 编辑

Linux下的Shell工作原理
摘要:Linux下的Shell工作原理 Linux系统提供给用户的最重要的系统程序是Shell命令语言解释程序。它不属于内核部分,而是在核心之外,以用户态方式运行。其基本功能是解释并执行用户打入的各种命令,实现用户与Linux核心的接口。系统初启后,核心为每个终端用户建立一个进程去执行Shell解释程序。它的执行过程基本上按如下步骤: (1)读取用户由键盘输入的命令行。 (2)分析命令,以命令名作为文件名,并将其它参数改造为系统调用execve( )内部处理所要求的形式。 (3)终端进程调用fork( )建立一个子进程。 (4)终端进程本身用系统调用wait4( )来等待子进程完成(如果是后台命令. 阅读全文

posted @ 2014-03-15 11:08 程良 阅读(1322) 评论(2) 推荐(0) 编辑

自然对齐/指定字节对齐---个人笔记
摘要:关于字节对齐,有时候真的不是很清楚,每个编译器都有自己的规定,而大多数都遵循自然对齐:就是取该数据结构中所占内存空间最大的那个变量对齐(先检查占内存较大的那个的大小,而其后的变量则向其靠齐)typedef struct aa{ char a; short b; }_aa;_aa A;A.a='1';A.b=7788;sizeof(A)? 答案为4.他们怎么存放的?小端模式下: --------0x0 a | '1'|0x1 b | 88 |0x2 | 77 |0x3 | * | --------那么这个呢?typedef struct _aa{ char ... 阅读全文

posted @ 2014-03-14 17:24 程良 阅读(503) 评论(0) 推荐(0) 编辑

offsetof宏---个人笔记
摘要:标准库里面提供的offsetof(t,m)宏,用来计算两个变量在内存中的地址偏移量#include //原型:#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)/*#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)对这个宏的讲解我们大致可以分为以下4步进行讲解:1、( (TYPE *)0 ) 0地址强制 "转换" 为 TYPE结构类型的指针;2、((TYPE *)0)->MEMBER 访问TYP 阅读全文

posted @ 2014-03-14 17:01 程良 阅读(332) 评论(0) 推荐(0) 编辑

sizeof()和 strlen()的区别 --- 个人笔记
摘要:在学习C语言和linux的时候,遇到了一些常见问题、题目,有些很简单,有些容易出错,本人水平有限,未免会出错,今天有时间,就将以前做的笔记,一一拿出来,写写blog。sizeof()和 strlen()的区别? 首先sizeof()是C语言提供的一个运算符,不是函数!它的作用主要是获得一个类型 或者一个对象里面内容的空间大小。 strlen()是一个标准库函数函数,用于计算一个字符串的长度,但是不把字符 '\0'计算在内。如char *buf="hello,world"strlen(buf)=11 sizeof(buf)=4 看看:sizeof( 2 + 3 阅读全文

posted @ 2014-03-14 16:51 程良 阅读(418) 评论(0) 推荐(0) 编辑

随机数洗牌
摘要:扑克牌洗牌是我们生活中比较喜欢玩的一个游戏。那么我们有没有什么办法自己设计一个扑克牌洗牌的方法呢?在c运行库当中有一个随机函数rand,它可以生成0~32767之间的任意数。那么有没有可能利用这么一个函数对我们扑克牌进行随即洗牌呢? 在这里我抛砖引玉一下,谈一谈自己目前已经看到的两个算法。欢迎朋友们谈一谈其他的方法。随机数洗牌1)任意洗牌 步骤如下所示: a)首先生成一个数组,大小为54,初始化为1~54 b)按照索引1到54,逐步对每一张索引牌进行洗牌,首先生成一个余数 pos1 = rand %54,pos2=rand %54,那么我们的索引牌就和这两个余数牌进... 阅读全文

posted @ 2014-03-14 16:24 程良 阅读(251) 评论(0) 推荐(0) 编辑

itoa函数递归实现
摘要:库函数中有atoi函数,用意是将字符形式输入的数据转换成数字,而库函数有没有提供一个将数字转换成字符的函数呢?答案是有的,而且功能很是强大,那就是sprintf()、snprintf()格式化转换函数,它的原型是:int sprintf(char *buf,const char *format,...) int snprintf(char *buf,int size,const char *format,...) 以上都是将数字转换成字符的形式的标准库函数。那么有没有别的自己实现的函数呢?好看看下面递归实现的:void _itoa(int value,char *str,int radix.. 阅读全文

posted @ 2014-03-14 15:59 程良 阅读(699) 评论(0) 推荐(0) 编辑

Socket编程详解
摘要:什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的.. 阅读全文

posted @ 2014-03-14 15:15 程良 阅读(2162) 评论(0) 推荐(0) 编辑

网络之基础知识
摘要:TCP/IP是个协议集,根据OSI的七层理论,TCP/IP分为四层,分别是:应用层,传输层,网络层,数据链路层.我们一般说TCP在传输层,而IP在Internet层,TCP/IP的应用程序包括我们平时经常用到的Ping,Telnet,Ftp,Finger等等 一、IP地址的概念 我们知道因特网是全世界范围内的计算机联为一体而构成的通信网络的总称。联在某个网络上的两台计算机之间在相互通信时,在它们所传送的数据包里都会含有某些附加信息,这些附加信息就是发送数据的计算机的地址和接受数据的计算机的地址。象这样,人们为了通信的方便给每一台计算机都事先分配一个类似我们日常生活中的电话号码一样的标... 阅读全文

posted @ 2014-03-14 11:05 程良 阅读(426) 评论(0) 推荐(0) 编辑

进程上下文&中断上下文
摘要:文章出自http://hi.baidu.com/bkhcvzdvmjfkpyr/item/5444001fa68d065bf1090ea6处理器总处于以下状态中的一种:1、内核态,运行于进程上下文,内核代表进程运行于内核空间;2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;3、用户态,运行于用户空间。进程上下文用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。中断 阅读全文

posted @ 2014-03-13 11:53 程良 阅读(212) 评论(0) 推荐(0) 编辑

linux下设备驱动的结构&编译&加载
摘要:构造和运行模块insmodmodprobermmod用来装载模块到正运行的内核和移除模块的用户空间工具。#includemodule_init(init_function);module_exit(cleanup_function);用于指定模块的初始化和清除函数的宏。__init__initdata__exit__exitdata仅用于模块初始化或清除阶段的函数(__init 、__exit)和数据 (__initdata、__exitdata) 标记。标记为初始化的项目会在初始化结束后丢弃;而退出项目在内核为被配置为可卸载模块的情况下被丢弃。内核通过将相应的目标对象放置在可执行文件的特殊E 阅读全文

posted @ 2014-03-13 11:38 程良 阅读(268) 评论(0) 推荐(0) 编辑

自旋锁&信号量
摘要:1. 自旋锁 Linux内核中最常见的锁是自旋锁。一个自旋锁就是一个互斥设备,它只能有两个值:"锁定"和"解锁"。如果锁可用,则"锁定"位被设置,而代码继续进入临界区;相反,如果锁被其他进程争用,则代码进入忙循环并重复检查这个锁,直到锁可用为止。这个循环就是自旋锁的"自旋"。自旋锁最多只能被一个可执行的线程持有。如果一个执行线程试图获得一个被争用的自旋锁,那么该线程就会一直进行忙循环-旋转-等待锁重新可用。注意,同一个锁可以用在多个位置。缺点:一个被争用的自旋锁使得请求它的线程在等待锁重新可用时自旋(特别浪费处理器 阅读全文

posted @ 2014-03-13 11:31 程良 阅读(1128) 评论(0) 推荐(0) 编辑

嵌入式Linux的启动过程
摘要:1.了解 Linux 最初是由瑞典赫尔辛基大学的学生 Linus Torvalds在1991 年开发出来的,之后在 GNU的支持下,Linux 获得了巨大的发展。虽然 Linux 在桌面 PC 机上的普及程度远不及微软的 Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些年来 Linux 在嵌入式领域的迅猛发展,更是给 Linux 注入了新的活力。 一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(bootloader), Linux 内核,文件系统,应用程序。其中 bootloader是系统启动或复位以后执行的第一段代码,.. 阅读全文

posted @ 2014-03-13 11:24 程良 阅读(2478) 评论(1) 推荐(0) 编辑

【转载】vim 中文帮助手册的安装
摘要:本文出处http://hi.baidu.com/bkhcvzdvmjfkpyr/item/9c238224c1a69498b6326360 vim自带的帮助手册是英文的, 对平时编程的人来说没有多大阅读困难, 何况还有"星级译王"呢, 可偏偏有一帮人将其翻译成了中文, 可偏偏我又挡不住诱惑将它安装了, 唉.......又痛失一个学习英文的好机会, 下不为例.大家看看我的中文帮助界面吧:(--- 图2 ---)安装方法:在下面的网站下载中文帮助的文件包:http://vimcdoc.sf.net (English)http://vimcdoc.sourceforge.net/ 阅读全文

posted @ 2014-03-13 10:53 程良 阅读(273) 评论(0) 推荐(0) 编辑

面向对象之编写驱动程序--中断(linux系统、s3c6410开发板)
摘要:/*-------------------------*先申明下,本人是个菜鸟,刚开始接触驱动程序编写,交代下开发环境(主机系统redhat6.3,开发板ARM-s3c6410)以watchdog (看门狗,俗称狗中断)为例,编写简单的中断(驱动)-------------------------*/#include #include #include #include #include #include #include MODULE_LICENSE("GPL");MODULE_AUTHOR("cheng");typedef struct mydev{ 阅读全文

posted @ 2014-03-12 20:34 程良 阅读(375) 评论(0) 推荐(0) 编辑

"排序二叉树"之探幽
摘要:/*怎么理解排序二叉树呢?在二叉树的基本定义上增加两个基本条件: (1)所有左子树的节点数值都小于此节点的数值; (2)所有右节点的数值都大于此节点的数值。 */ 1 /************************头文件部分**************************/ 2 /******************************************************** 3 filename :tree_head.h 4 time :2013-11-13 5 copyrignt:none 6 author :cheng 7 ***... 阅读全文

posted @ 2014-03-12 20:27 程良 阅读(257) 评论(0) 推荐(0) 编辑

内存管理
摘要:高效的程序离不开内存的有效管理。在有效的内存资源的前提下,有效的对内存管理的好处不少:减少内存分配、回收开销、避免内存碎片、定位内存位置、方便内存整理、跟踪内存使用等等。V8 的堆内存Heap用于存预编译的code、JS对象内存分配、运行上下文对象分配、垃圾回收等。试题1:1 void test1()2 {3 char string[10];4 char *str1 = "0123456789";5 strcpy( string, str1 );6 }试题2: 1 void test2() 2 { 3 char string[10], str1[10]; 4 i... 阅读全文

posted @ 2014-03-12 20:19 程良 阅读(266) 评论(0) 推荐(0) 编辑

摘要:前面我们讲到了容器,今天我们接着讨论另外一种数据结构:堆栈。堆栈几乎是程序设计的命脉,没有堆栈就没有函数调用,当然也就没有软件设计。那么堆栈有什么特殊的属性呢?其实,堆栈的属性主要表现在下面两个方面:1)堆栈的数据是先入后出2)堆栈的长度取决于栈顶的高度那么,作为连续内存类型的堆栈应该怎么设计呢?大家可以自己先试一下:#ifndef _stack_h#define _stack_h#include #include #define EMPTYSTACK -1#define MINSTACKSIZE 5typedef struct stackRecord{ int capacity; int t 阅读全文

posted @ 2014-03-12 19:45 程良 阅读(267) 评论(0) 推荐(0) 编辑

Linux 系统下10个查看网络与监听的命令
摘要:下面列出来的10个基础的每个linux用户都应该知道的网络和监控命令。网络和监控命令类似于这些: hostname, ping, ifconfig, iwconfig, netstat, nslookup, traceroute, finger, telnet, ethtool 用于查看linux服务器ip地址,管理服务器网络配置 ,通过 telnet 和ethernet建立与linux之间的网络链接,查看linux的服务器信息等。下面让我们看看在linux下的网络和监控命令的使用。1. hostnamehostname 没有选项,显示主机名字hostname –d显示机器所属域名host.. 阅读全文

posted @ 2014-03-12 19:24 程良 阅读(4293) 评论(0) 推荐(0) 编辑

Linux下用gdb 调试、查看代码堆栈
摘要:Linux中用gdb 查看代码堆栈的信息core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的。调试的话输入: gdb filename core filename就是产生core文件的可执行文件,core就是产生的dump文件查看栈信息—————当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用GDB命令来查看当前的栈中的信息。下面是一些查看函数调用栈信息的GDB命令:backtracebt打印当前的 阅读全文

posted @ 2014-03-12 19:06 程良 阅读(117147) 评论(2) 推荐(2) 编辑

GPIO引脚速度的应用匹配
摘要:GPIO 引脚速度: GPIO 引脚速度又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。) 可理解为:输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。(如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。)如果信号频率为10MHz,而你配置了2MHz的带宽,则10MHz的方波很可能就变成了正弦波。就好比是公路的设计时速,汽车速度低于设计时速时,可以平稳地运行,如果超过设计时速就会颠簸,甚至翻车。关键是: 阅读全文

posted @ 2014-03-12 18:53 程良 阅读(884) 评论(0) 推荐(0) 编辑

编写安全的代码——小心有符号数的右移操作
摘要:在嵌入式开发当中,做数据运算(乘、除)等表达式时,移位操作是工程师们的最爱。但是也要非常谨慎,比如有符号数和无符号数、变量的取值范围。来看看这样一段小代码:#include #include static void divide_by_two(int num) { while (num){ printf("%d\n", num); num /= 2; } } int main(void) { int num; scanf("%d", &num); divide_by_two(num); return 0;... 阅读全文

posted @ 2014-03-12 18:30 程良 阅读(741) 评论(0) 推荐(0) 编辑

C语言实现类似C++的容器vector
摘要:C语言也能面向对象?不是C++是面向对象的么?其实C语言也能抽象成简单的面向对象方法,在Linux内核源码当中,底层的驱动代码、文件系统等皆采用了面向对象的封装技术,这样的好处是将客观的东西抽象出来,以接口的方式管理。 C++完全包容C语言的语法特点,C++中类:class和C语言中的结构体:struct是等效的,不过C++是一种完全面向对象的模式,其中域、对象名,都封装在类里面,而C语言没有明确规定,只是结构体是一种根据设计需要来构造的一种特殊的数据类型。C++中每个类都提供一个默认的构造函数和析构函数(当然也可以自定义一个构造函数)。下面是用纯C语言实现一个C++的vector容器:... 阅读全文

posted @ 2014-03-12 18:23 程良 编辑

求字符串长度之递归与非递归的C语言实现
摘要:在上一篇中介绍了字符串拷贝的递归与非递归的实现,这里就不在赘述递归原理。递归求字符串长度_strlen:1 int _strlen(const char *src)2 { 3 if( src == NULL || *src == '\0') 4 return 0;5 6 return (_strlen(++src)+1); 7 } 分析:统计字符串长度的时候,'\0'是不统计的,也就是说遇到'\0'函数就停止递归调用。return (_strlen(++src)+1); 这个语句意思就是*src不为'\0'长度就加上一个1,有多少 阅读全文

posted @ 2014-03-12 15:20 程良 阅读(2062) 评论(0) 推荐(0) 编辑

字符串拷贝函数递归与非递归的C语言实现
摘要:初学递归的时候,觉得很抽象,不好分析,确实如此,尤其是有些时候控制语句不对,导致程序进去无限次的调用,更严重的是栈溢出。既要正确的控制结束语句,又要有正确的进入下次递归的语句,还要有些操作语句......。所以要使用递归,必须每一层的思路要相当清晰。而循环和递归还是挺类似的说,循环的次数可以近似的理解为要递归是次数。那么下面我们看看递归和循环的区别:1.递归实现strcpy函数:1 void _strcpy(char *to,const char *from)2 {3 if('\0' == *from){ 4 *to = '\0';5 return ;6 }7 阅读全文

posted @ 2014-03-12 14:23 程良 阅读(823) 评论(0) 推荐(0) 编辑

导航