<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>阿学的学习空间</title><link>http://www.cnteachersblog.com/whjtoby/</link><description>学习博客</description><managingEditor>末名教师</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>末名教师</dc:creator><title>atoi</title><link>http://www.cnteachersblog.com/whjtoby/archive/2010/02/14/7852.html</link><pubDate>Sun, 14 Feb 2010 03:22:00 GMT</pubDate><guid>http://www.cnteachersblog.com/whjtoby/archive/2010/02/14/7852.html</guid><wfw:comment>http://www.cnteachersblog.com/whjtoby/comments/7852.html</wfw:comment><comments>http://www.cnteachersblog.com/whjtoby/archive/2010/02/14/7852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnteachersblog.com/whjtoby/comments/commentRss/7852.html</wfw:commentRss><trackback:ping>http://www.cnteachersblog.com/whjtoby/services/trackbacks/7852.html</trackback:ping><description>&lt;h1&gt;atoi&lt;/h1&gt; &lt;div id="lemmaContent"&gt;　　C语言库函数名: atoi&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　功 能: 把字符串转换成整型数.&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　名字来源:array to integer 的缩写.&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　函数说明: atoi()会扫描参数nptr字符串，如果第一个字符不是数字也不是正负号返回零，否则开始做类型转换，之后检测到非数字或结束符 \0 时停止转换，返回整型数。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　原型: int atoi(const char *nptr);&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　需要用到的头文件: #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　程序例:&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　1）&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int main(void)&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int n;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char *str = "12345.67";&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　n = atoi(str);&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　printf("string = %s integer = %d\n", str, n);&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　return 0;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　}&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　执行结果&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　string = 12345.67 integer = 12345&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　2）&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int main()&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char a[] = "-100" ;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char b[] = "123" ;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int c ;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　c = atoi( a ) + atoi( b ) ;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　printf("c = %d\n", c) ;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　return 0;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　}&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　执行结果&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　c = 23&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　简单的实现atoi函数的源代码：&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int my_atoi(const char *str){&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int result;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int signal = 1; /* 默认为正数 */&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　if((*str&amp;gt;='0'&amp;amp;&amp;amp;*str&amp;lt;='9')||*str=='-'||*str=='+'){&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　if(*str=='-'||*str=='+'){&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　if(*str=='-')&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　signal = -1; /* 输入负数 */&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　str++;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　} &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　}&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　else return 0;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* 开始转换 */&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　while(*str&amp;gt;='0'&amp;amp;&amp;amp;*str&amp;lt;='9')&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　result = result*10+(*str++ -'0');&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　return signal*result;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　}&lt;br /&gt;&lt;/div&gt;&lt;img src ="http://www.cnteachersblog.com/whjtoby/aggbug/7852.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>末名教师</dc:creator><title>struct</title><link>http://www.cnteachersblog.com/whjtoby/archive/2010/02/14/7850.html</link><pubDate>Sun, 14 Feb 2010 03:20:00 GMT</pubDate><guid>http://www.cnteachersblog.com/whjtoby/archive/2010/02/14/7850.html</guid><wfw:comment>http://www.cnteachersblog.com/whjtoby/comments/7850.html</wfw:comment><comments>http://www.cnteachersblog.com/whjtoby/archive/2010/02/14/7850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnteachersblog.com/whjtoby/comments/commentRss/7850.html</wfw:commentRss><trackback:ping>http://www.cnteachersblog.com/whjtoby/services/trackbacks/7850.html</trackback:ping><description>&lt;strong&gt;结构类型&lt;/strong&gt;&lt;strong&gt;定义和结构变量说明&lt;br /&gt;&lt;/strong&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　　在实际问题中，一组数据往往具有不同的数据类型。例如， 在学生登记表中，姓名应为字符型；学号可为整型或字符型； 年龄应为整型；性别应为字符型；成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致，以便于编译系统处理。为了解决这个问题，Ｃ语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　“结构”是一种构造类型，它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构既是一种“构造”而成的数据类型， 那么在说明和使用之前必须先定义它，也就是构造它。如同在说明和调用函数之前要先定义函数一样。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　一、结构的定义&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　定义一个结构的一般形式为： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　struct 结构名 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　成员表列 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　};&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　成员表由若干个成员组成， 每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明，其形式为：&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　类型说明符 成员名; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　成员名的命名应符合标识符的书写规定。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　例如： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　struct stu&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int num;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char name[20];&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char sex;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　float score;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　}; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　在这个结构定义中，结构名为stu，该结构由4个成员组成。 第一个成员为num，整型变量；第二个成员为name，字符数组；第三个成员为sex，字符变量；第四个成员为score，实型变量。 应注意在括号后的分号是不可少的。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　二、结构的说明&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　结构定义之后，即可进行变量说明。 凡说明为结构stu的变量都由上述4个成员组成。由此可见， 结构是一种复杂的数据类型，是数目固定，类型不同的若干有序变量的集合。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　请看下面的结构：&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　struct MyStruct&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　double dda1;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char dda;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int type&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　};&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　对结构MyStruct采用sizeof会出现什么结果呢？sizeof(MyStruct)为多少呢？也许你会这样求：&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　但是当在VC中测试上面结构的大小时，你会发现sizeof(MyStruct)为16。你知道为什么在VC中会得出这样一个结果吗？&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　其实，这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度，VC对一些变量的起始地址做了“&lt;b&gt;对齐&lt;/b&gt;”处理。在默认情况下，VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vc6.0,32位系统)。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　类型&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　对齐方式（变量存放的起始地址相对于结构的起始地址的偏移量）&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　Char&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　偏移量必须为sizeof(char)即1的倍数&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　偏移量必须为sizeof(int)即4的倍数&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　float&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　偏移量必须为sizeof(float)即4的倍数&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　double&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　偏移量必须为sizeof(double)即8的倍数&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　Short&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　偏移量必须为sizeof(short)即2的倍数&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　1、默认的对齐方式&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　各成员变量在存放的时候根据在结构中出现的顺序依次申请空间，同时按照上面的对齐方式调整位置，空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的&lt;b&gt;字节边界数&lt;/b&gt;（即该结构中占用最大空间的类型所占用的字节数）的倍数，所以在为最后一个成员变量申请空间后，还会根据需要自动填充空缺的字节。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　下面用前面的例子来说明VC到底怎么样来存放结构的。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　struct MyStruct &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　double dda1; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char dda;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int type&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　}；&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　为上面的结构分配空间的时候，VC根据成员变量出现的顺序和对齐方式，先为第一个成员dda1分配空间，其起始地址跟结构的起始地址相同（刚好偏移量0刚好为sizeof(double)的倍数），该成员变量占用sizeof(double)=8个字节；接下来为第二个成员dda分配空间，这时下一个可以分配的地址对于结构的起始地址的偏移量为8，是sizeof(char)的倍数，所以把dda存放在偏移量为8的地方满足对齐方式，该成员变量占用sizeof(char)=1个字节；接下来为第三个成员type分配空间，这时下一个可以分配的地址对于结构的起始地址的偏移量为9，不是sizeof(int)=4的倍数，为了满足对齐方式对偏移量的约束问题，VC自动填充3个字节（这三个字节没有放什么东西），这时下一个可以分配的地址对于结构的起始地址的偏移量为12，刚好是sizeof(int)=4的倍数，所以把type存放在偏移量为12的地方，该成员变量占用sizeof(int)=4个字节；这时整个结构的成员变量已经都分配了空间，总的占用的空间大小为：8+1+3+4=16，刚好为结构的字节边界数（即结构中占用最大空间的类型所占用的字节数sizeof(double)=8）的倍数，所以没有空缺的字节需要填充。所以整个结构的大小为：sizeof(MyStruct)=8+1+3+4=16，其中有3个字节是VC自动填充的，没有放任何有意义的东西。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　下面再举个例子，交换一下上面的MyStruct的成员变量的位置，使它变成下面的情况：&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　struct MyStruct &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char dda;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　double dda1; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int type&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　}；&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　这个结构占用的空间为多大呢？在VC6.0环境下，可以得到sizeof(MyStruc)为24。结合上面提到的分配空间的一些原则，分析下VC怎么样为上面的结构分配空间的。（简单说明）&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　struct MyStruct &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char dda;//偏移量为0，满足对齐方式，dda占用1个字节；&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　double dda1;//下一个可用的地址的偏移量为1，不是sizeof(double)=8&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　//的倍数，需要补足7个字节才能使偏移量变为8（满足对齐&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　//方式），因此VC自动填充7个字节，dda1存放在偏移量为8&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　//的地址上，它占用8个字节。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int type；//下一个可用的地址的偏移量为16，是sizeof(int)=4的倍&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　//数，满足int的对齐方式，所以不需要VC自动填充，type存&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　//放在偏移量为16的地址上，它占用4个字节。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　}；//所有成员变量都分配了空间，空间总的大小为1+7+8+4=20，不是结构&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　//的节边界数（即结构中占用最大空间的类型所占用的字节数sizeof&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　//(double)=8）的倍数，所以需要填充4个字节，以满足结构的大小为&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　//sizeof(double)=8的倍数。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　所以该结构总的大小为：sizeof(MyStruc)为1+7+8+4+4=24。其中总的有7+4=11个字节是VC自动填充的，没有放任何有意义的东西。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　2、n字节的对齐方式&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　VC对结构的存储的特殊处理确实提高CPU存储变量的速度，但是有时候也带来了一些麻烦，我们也屏蔽掉变量默认的对齐方式，自己可以设定变量的对齐方式。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况：第一、如果n大于等于该变量所占用的字节数，那么偏移量必须满足默认的对齐方式，第二、如果n小于该变量的类型所占用的字节数，那么偏移量为n的倍数，不用满足默认的对齐方式。结构的总大小也有个约束条件，分下面两种情况：如果n大于所有成员变量类型所占用的字节数，那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数；&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　否则必须为n的倍数。下面举例说明其用法。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#pragma pack(push) //保存对齐状态&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#pragma pack(4)//设定为4字节对齐&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　struct test&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char m1;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　double m4;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int m3;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　};&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#pragma pack(pop)//恢复对齐状态&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　以上结构的大小为16，下面分析其存储情况，首先为m1分配空间，其偏移量为0，满足我们自己设定的对齐方式（4字节对齐），m1占用1个字节。接着开始为m4分配空间，这时其偏移量为1，需要补足3个字节，这样使偏移量满足为n=4的倍数（因为sizeof(double)大于n）,m4占用8个字节。接着为m3分配空间，这时其偏移量为12，满足为4的倍数，m3占用4个字节。这时已经为所有成员变量分配了空间，共分配了16个字节，满足为n的倍数。如果把上面的#pragma pack(4)改为#pragma pack(16)，那么我们可以得到结构的大小为24。（请读者自己分析）&lt;br /&gt;&lt;img src ="http://www.cnteachersblog.com/whjtoby/aggbug/7850.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>末名教师</dc:creator><title>malloc</title><link>http://www.cnteachersblog.com/whjtoby/archive/2010/02/14/7851.html</link><pubDate>Sun, 14 Feb 2010 03:20:00 GMT</pubDate><guid>http://www.cnteachersblog.com/whjtoby/archive/2010/02/14/7851.html</guid><wfw:comment>http://www.cnteachersblog.com/whjtoby/comments/7851.html</wfw:comment><comments>http://www.cnteachersblog.com/whjtoby/archive/2010/02/14/7851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnteachersblog.com/whjtoby/comments/commentRss/7851.html</wfw:commentRss><trackback:ping>http://www.cnteachersblog.com/whjtoby/services/trackbacks/7851.html</trackback:ping><description>&lt;h1&gt;malloc&lt;/h1&gt; &lt;div id="lemmaContent"&gt;　　&lt;b&gt;原型&lt;/b&gt;：extern void *malloc(unsigned int num_bytes);&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　&lt;b&gt;用法&lt;/b&gt;：#include &amp;lt;malloc.h&amp;gt;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　或#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　&lt;b&gt;功能&lt;/b&gt;：用于向内存申请空间，分配长度为num_bytes字节的内存块&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　&lt;b&gt;说明&lt;/b&gt;：如果分配成功则返回指向被分配内存的指针，否则返回空指针NULL。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　当内存不再使用时，应使用free()函数将内存块释放。&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　&lt;b&gt;调用格式，&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　&lt;/b&gt;指针名=（指针所指对象的数据类型*）malloc（个数*sizeof(指针所指对象的数据类型)），其对应例子如下：&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int *p = (int *) malloc ( n* sizeof(int) );&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　&lt;b&gt;举例&lt;/b&gt;：&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　// malloc.c&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#include &amp;lt;syslib.h&amp;gt;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#include &amp;lt;malloc.h&amp;gt;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　main()&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char *p;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　clrscr(); // clear screen&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　p=(char *)malloc(100);&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　if(p)&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　printf("Memory Allocated at: %x",p);&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　else&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　printf("Not Enough Memory!\n");&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　&lt;b&gt;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　if(p)&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　free(p);&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　getchar();&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　return 0;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　}&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　&lt;/b&gt; &lt;div class="bpctrl"&gt;&lt;/div&gt; &lt;h2 class="first"&gt; &lt;div class="text_edit"&gt;[编辑本段]&lt;/div&gt;malloc（）函数的工作机制&lt;/h2&gt;　　malloc函数的实质体现在，它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时，它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后，将该内存块一分为二（一块的大小与用户请求的大小相等，另一块的大小就是剩下的字节）。接下来，将分配给用户的那块内存传给用户，并将剩下的那块（如果有的话）返回到连接表上。调用free函数时，它将用户释放的内存块连接到空闲链上。到最后，空闲链会被切成很多的小内存片段，如果这时用户申请一个大的内存片段，那么空闲链上可能没有可以满足用户要求的片段了。于是，malloc函数请求延时，并开始在空闲链上翻箱倒柜地检查各内存片段，对它们进行整理，将相邻的小空闲块合并成较大的内存块。 &lt;div class="bpctrl"&gt;&lt;/div&gt; &lt;h2&gt; &lt;div class="text_edit"&gt;[编辑本段]&lt;/div&gt;浅析malloc（）的几种实现方式&lt;/h2&gt;　　malloc（）是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数，返回值是一个指向所分配的连续存储域的起始地址的指针。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间，而是由系统根据程序的需要即时分配，且分配的大小就是程序要求的大小。本文简单介绍动态内存分配函数malloc（）及几种实现方法。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　1． 简介 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　malloc（）是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数，返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是，当函数未能成功分配存储空间（如内存不足）就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　2． 函数说明 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　C语言的动态存储管理由一组标准库函数实现，其原型在标准文件&amp;lt;stdlib.h&amp;gt;里描述，需要用这些功能时应包含这个文件。与动态存储分配有关的函数共有四个，其中就包括存储分配函数malloc（）。函数原型是：void *malloc (size_t n);这里的size_t是标准库里定义的一个类型，它是一个无符号整型。这个整型能够满足所有对存储块大小描述的需要，具体相当于哪个整型由具体的C系统确定。malloc的返回值为(void *)类型（这是通用指针的一个重要用途），它分配一片能存放大小为n的数据的存储块，返回对应的指针值；如果不能满足申请（找不到能满足要求的存储块）就返回NULL。在使用时，应该把malloc的返回值转换到特定指针类型，赋给一个指针。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　注意，虽然这里的存储块是通过动态分配得到的，但是它的大小也是确定的，同样不允许越界使用。例如上面程序段分配的块里能存n个双精度数据，随后的使用就必须在这个范围内进行。越界使用动态分配的存储块，尤其是越界赋值，可能引起非常严重的后果，通常会破坏程序的运行系统，可能造成本程序或者整个计算机系统垮台。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　下例是一个动态分配的例子：&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　main()&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int count,*array; /*count是一个计数器，array是一个整型指针，也可以理解为指向一个整型数组的首地址*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　count=100;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　if((array=(int *)malloc(10*sizeof(int))) == NULL)&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　printf("不能成功分配存储空间。");&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　exit(1);&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　}&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　for(count=0;count&amp;lt;10;count++) /*给数组赋值*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　array[count]=count;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　for(count=0;count&amp;lt;10;count++) /*打印数组元素*/&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　printf("%2d",array[count]);&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　} &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　上例中动态分配了10个整型存储区域，然后进行赋值并打印。例中if((array=(int *) malloc (10*sizeof(int)))==NULL)语句可以分为以下几步： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　1）分配10个整型的连续存储空间，并返回一个指向其起始地址的整型指针 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　2）把此整型指针地址赋给array &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　3）检测返回值是否为NULL &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　例2，本例用于说明malloc()的返回值的情况&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　下面的代码片段的输出是什么，为什么？&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　char *ptr;&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　if ((ptr = (char *)malloc(0)) == NULL) &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　puts(&lt;i&gt;"&lt;/i&gt;Got a null pointer&lt;i&gt;"&lt;/i&gt;);&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　else&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　puts(&lt;i&gt;"&lt;/i&gt;Got a valid pointer&lt;i&gt;"&lt;/i&gt;);&lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　把0值传给了函数malloc，得到了一个合法的指针之后，这就是上面的代码，该代码的输出是&lt;i&gt;"&lt;/i&gt;Got a valid pointer&lt;i&gt;"&lt;/i&gt;。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　3． malloc（）工作机制 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　malloc函数的实质体现在，它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时，它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后，将该内存块一分为二（一块的大小与用户请求的大小相等，另一块的大小就是剩下的字节）。接下来，将分配给用户的那块内存传给用户，并将剩下的那块（如果有的话）返回到连接表上。调用free函数时，它将用户释放的内存块连接到空闲链上。到最后，空闲链会被切成很多的小内存片段，如果这时用户申请一个大的内存片段，那么空闲链上可能没有可以满足用户要求的片段了。于是，malloc函数请求延时，并开始在空闲链上翻箱倒柜地检查各内存片段，对它们进行整理，将相邻的小空闲块合并成较大的内存块。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　4． malloc（）在操作系统中的实现 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　在 C 程序中，多次使用malloc () 和 free()。不过，您可能没有用一些时间去思考它们在您的操作系统中是如何实现的。本节将向您展示 malloc 和 free 的一个最简化实现的代码，来帮助说明管理内存时都涉及到了哪些事情。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　在大部分操作系统中，内存分配由以下两个简单的函数来处理： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　void *malloc (long numbytes)：该函数负责分配 numbytes 大小的内存，并返回指向第一个字节的指针。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　void free(void *firstbyte)：如果给定一个由先前的 malloc 返回的指针，那么该函数会将分配的空间归还给进程的“空闲空间”。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　malloc_init 将是初始化内存分配程序的函数。它要完成以下三件事：将分配程序标识为已经初始化，找到系统中最后一个有效内存地址，然后建立起指向我们管理的内存的指针。这三个变量都是全局变量： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　清单 1. 我们的简单分配程序的全局变量 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int has_initialized = 0; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　void *managed_memory_start; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　void *last_valid_address; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　如前所述，被映射的内存的边界（最后一个有效地址）常被称为系统中断点或者 当前中断点。在很多 UNIX? 系统中，为了指出当前系统中断点，必须使用 sbrk(0) 函数。 sbrk 根据参数中给出的字节数移动当前系统中断点，然后返回新的系统中断点。使用参数 0 只是返回当前中断点。这里是我们的 malloc 初始化代码，它将找到当前中断点并初始化我们的变量： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　清单 2. 分配程序初始化函数 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Include the sbrk function */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　#include &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　void malloc_init() &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* grab the last valid address from the OS */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　last_valid_address = sbrk(0); &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* we don't have any memory to manage yet, so &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*just set the beginning to be last_valid_address &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　managed_memory_start = last_valid_address; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Okay, we're initialized and ready to go */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　has_initialized = 1; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　} &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　现在，为了完全地管理内存，我们需要能够追踪要分配和回收哪些内存。在对内存块进行了 free 调用之后，我们需要做的是诸如将它们标记为未被使用的等事情，并且，在调用 malloc 时，我们要能够定位未被使用的内存块。因此， malloc 返回的每块内存的起始处首先要有这个结构： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　清单 3. 内存控制块结构定义 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　struct mem_control_block { &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int is_available; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　int size; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　}; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　现在，您可能会认为当程序调用 malloc 时这会引发问题 —— 它们如何知道这个结构？答案是它们不必知道；在返回指针之前，我们会将其移动到这个结构之后，把它隐藏起来。这使得返回的指针指向没有用于任何其他用途的内存。那样，从调用程序的角度来看，它们所得到的全部是空闲的、开放的内存。然后，当通过 free() 将该指针传递回来时，我们只需要倒退几个内存字节就可以再次找到这个结构。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　在讨论分配内存之前，我们将先讨论释放，因为它更简单。为了释放内存，我们必须要做的惟一一件事情就是，获得我们给出的指针，回退 sizeof(struct mem_control_block) 个字节，并将其标记为可用的。这里是对应的代码： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　清单 4. 解除分配函数 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　void free(void *firstbyte) { &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　struct mem_control_block *mcb; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Backup from the given pointer to find the &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* mem_control_block &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　mcb = firstbyte - sizeof(struct mem_control_block); &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Mark the block as being available */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　mcb-&amp;gt;is_available = 1; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* That's It! We're done. */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　return; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　} &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　如您所见，在这个分配程序中，内存的释放使用了一个非常简单的机制，在固定时间内完成内存释放。分配内存稍微困难一些。以下是该算法的略述： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　清单 5. 主分配程序的伪代码 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　1. If our allocator has not been initialized, initialize it. &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　2. Add sizeof(struct mem_control_block) to the size requested. &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　3. start at managed_memory_start. &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　4. Are we at last_valid address? &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　5. If we are: &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　A. We didn't find any existing space that was large enough &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　-- ask the operating system for more and return that. &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　6. Otherwise: &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　A. Is the current space available (check is_available from &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　the mem_control_block)? &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　B. If it is: &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　i) Is it large enough (check "size" from the &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　mem_control_block)? &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　ii) If so: &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　a. Mark it as unavailable &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　b. Move past mem_control_block and return the &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　pointer &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　iii) Otherwise: &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　a. Move forward "size" bytes &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　b. Go back go step 4 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　C. Otherwise: &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　i) Move forward "size" bytes &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　ii) Go back to step 4 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　我们主要使用连接的指针遍历内存来寻找开放的内存块。这里是代码： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　清单 6. 主分配程序 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　void *malloc(long numbytes) { &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Holds where we are looking in memory */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　void *current_location; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* This is the same as current_location, but cast to a &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* memory_control_block &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　struct mem_control_block *current_location_mcb; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* This is the memory location we will return. It will &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* be set to 0 until we find something suitable &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　void *memory_location; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Initialize if we haven't already done so */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　if(! has_initialized) { &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　malloc_init(); &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　} &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* The memory we search for has to include the memory &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* control block, but the users of malloc don't need &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* to know this, so we'll just add it in for them. &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　numbytes = numbytes + sizeof(struct mem_control_block); &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Set memory_location to 0 until we find a suitable &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* location &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　memory_location = 0; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Begin searching at the start of managed memory */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　current_location = managed_memory_start; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Keep going until we have searched all allocated space */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　while(current_location != last_valid_address) &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* current_location and current_location_mcb point &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* to the same address. However, current_location_mcb &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* is of the correct type, so we can use it as a struct. &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* current_location is a void pointer so we can use it &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* to calculate addresses. &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　current_location_mcb = &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　(struct mem_control_block *)current_location; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　if(current_location_mcb-&amp;gt;is_available) &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　if(current_location_mcb-&amp;gt;size &amp;gt;= numbytes) &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Woohoo! We've found an open, &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* appropriately-size location. &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* It is no longer available */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　current_location_mcb-&amp;gt;is_available = 0; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* We own it */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　memory_location = current_location; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Leave the loop */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　break; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　} &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　} &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* If we made it here, it's because the Current memory &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* block not suitable; move to the next one &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　current_location = current_location + &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　current_location_mcb-&amp;gt;size; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　} &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* If we still don't have a valid location, we'll &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* have to ask the operating system for more memory &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　if(! memory_location) &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　{ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Move the program break numbytes further */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　sbrk(numbytes); &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* The new memory will be where the last valid &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* address left off &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　memory_location = last_valid_address; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* We'll move the last valid address forward &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* numbytes &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　last_valid_address = last_valid_address + numbytes; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* We need to initialize the mem_control_block */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　current_location_mcb = memory_location; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　current_location_mcb-&amp;gt;is_available = 0; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　current_location_mcb-&amp;gt;size = numbytes; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　} &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Now, no matter what (well, except for error conditions), &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* memory_location has the address of the memory, including &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　* the mem_control_block &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　*/ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Move the pointer past the mem_control_block */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　memory_location = memory_location + sizeof(struct mem_control_block); &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　/* Return the pointer */ &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　return memory_location; &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　} &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　这就是我们的内存管理器。现在，我们只需要构建它，并在程序中使用它即可。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　5． malloc（）的其他实现 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　malloc() 的实现有很多，这些实现各有优点与缺点。在设计一个分配程序时，要面临许多需要折衷的选择，其中包括： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　分配的速度。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　回收的速度。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　有线程的环境的行为。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　内存将要被用光时的行为。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　局部缓存。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　簿记（Bookkeeping）内存开销。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　虚拟内存环境中的行为。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　小的或者大的对象。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　实时保证。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　每一个实现都有其自身的优缺点集合。在我们的简单的分配程序中，分配非常慢，而回收非常快。另外，由于它在使用虚拟内存系统方面较差，所以它最适于处理大的对象。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　还有其他许多分配程序可以使用。其中包括： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　Doug Lea Malloc：Doug Lea Malloc 实际上是完整的一组分配程序，其中包括 Doug Lea 的原始分配程序，GNU libc 分配程序和 ptmalloc。 Doug Lea 的分配程序有着与我们的版本非常类似的基本结构，但是它加入了索引，这使得搜索速度更快，并且可以将多个没有被使用的块组合为一个大的块。它还支持缓存，以便更快地再次使用最近释放的内存。 ptmalloc 是 Doug Lea Malloc 的一个扩展版本，支持多线程。在本文后面的 参考资料部分中，有一篇描述 Doug Lea 的 Malloc 实现的文章。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　BSD Malloc：BSD Malloc 是随 4.2 BSD 发行的实现，包含在 FreeBSD 之中，这个分配程序可以从预先确实大小的对象构成的池中分配对象。它有一些用于对象大小的 size 类，这些对象的大小为 2 的若干次幂减去某一常数。所以，如果您请求给定大小的一个对象，它就简单地分配一个与之匹配的 size 类。这样就提供了一个快速的实现，但是可能会浪费内存。在 参考资料部分中，有一篇描述该实现的文章。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　Hoard：编写 Hoard 的目标是使内存分配在多线程环境中进行得非常快。因此，它的构造以锁的使用为中心，从而使所有进程不必等待分配内存。它可以显著地加快那些进行很多分配和回收的多线程进程的速度。在 参考资料部分中，有一篇描述该实现的文章。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　众多可用的分配程序中最有名的就是上述这些分配程序。如果您的程序有特别的分配需求，那么您可能更愿意编写一个定制的能匹配您的程序内存分配方式的分配程序。不过，如果不熟悉分配程序的设计，那么定制分配程序通常会带来比它们解决的问题更多的问题。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　6． 结束语 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　前面已经提过，多次调用malloc（）后空闲内存被切成很多的小内存片段，这就使得用户在申请内存使用时，由于找不到足够大的内存空间，malloc（）需要进行内存整理，使得函数的性能越来越低。聪明的程序员通过总是分配大小为2的幂的内存块，而最大限度地降低潜在的malloc性能丧失。也就是说，所分配的内存块大小为4字节、8字节、16字节、18446744073709551616字节，等等。这样做最大限度地减少了进入空闲链的怪异片段（各种尺寸的小片段都有）的数量。尽管看起来这好像浪费了空间，但也容易看出浪费的空间永远不会超过50%。 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　参考文献： &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　[1] Jonathan Bartlett，内存管理内幕. developerWorks 中国，2004年11月 &lt;br /&gt; &lt;div class="spctrl"&gt;&lt;/div&gt;　　[2] Jan Lindblad，内存碎片处理技术. EDN电子设计技术，2004年10月08日&lt;br /&gt;&lt;/div&gt;&lt;img src ="http://www.cnteachersblog.com/whjtoby/aggbug/7851.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>末名教师</dc:creator><title>Zend_Pdf制作中文的pdf在线生成教程</title><link>http://www.cnteachersblog.com/whjtoby/archive/2010/01/17/7782.html</link><pubDate>Sun, 17 Jan 2010 11:02:00 GMT</pubDate><guid>http://www.cnteachersblog.com/whjtoby/archive/2010/01/17/7782.html</guid><wfw:comment>http://www.cnteachersblog.com/whjtoby/comments/7782.html</wfw:comment><comments>http://www.cnteachersblog.com/whjtoby/archive/2010/01/17/7782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnteachersblog.com/whjtoby/comments/commentRss/7782.html</wfw:commentRss><trackback:ping>http://www.cnteachersblog.com/whjtoby/services/trackbacks/7782.html</trackback:ping><description>&lt;div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 98%; PADDING-RIGHT: 5.4pt; BACKGROUND: #e6e6e6; WORD-BREAK: break-all; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; PADDING-TOP: 4px"&gt; &lt;div&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;&lt;span style="COLOR: #000000"&gt;$pdf&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Zend_Pdf();&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;$page&amp;nbsp;=&amp;nbsp;$pdf-&amp;gt;newPage(Zend_Pdf_Page::SIZE_A4);&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;$pdf-&amp;gt;pages[]&amp;nbsp;=&amp;nbsp;$page;&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;$font&amp;nbsp;=&amp;nbsp;Zend_Pdf_Font::fontWithPath('c:\\windows\\fonts\\simkai.ttf',&amp;nbsp;(Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION&amp;nbsp;|&amp;nbsp;Zend_Pdf_Font::EMBED_DONT_COMPRESS));&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;$page-&amp;gt;setFont($font,&amp;nbsp;15);&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;$page-&amp;gt;drawText('WEB开发技术站长站欢迎你！！:)&amp;nbsp;hello&amp;nbsp;word!',100,700);&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;$pdfData&amp;nbsp;=&amp;nbsp;$pdf-&amp;gt;render();&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;header('Content-Disposition:inline;&amp;nbsp;filename=result.pdf');&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;header('Content-type:application/x-pdf');&lt;br /&gt;&lt;img align="top" src="/Images/OutliningIndicators/None.gif" /&gt;echo&amp;nbsp;$pdfData;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src ="http://www.cnteachersblog.com/whjtoby/aggbug/7782.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>末名教师</dc:creator><title>新做了个网站-乐清鲜花网</title><link>http://www.cnteachersblog.com/whjtoby/archive/2010/01/13/7770.html</link><pubDate>Wed, 13 Jan 2010 12:49:00 GMT</pubDate><guid>http://www.cnteachersblog.com/whjtoby/archive/2010/01/13/7770.html</guid><wfw:comment>http://www.cnteachersblog.com/whjtoby/comments/7770.html</wfw:comment><comments>http://www.cnteachersblog.com/whjtoby/archive/2010/01/13/7770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnteachersblog.com/whjtoby/comments/commentRss/7770.html</wfw:commentRss><trackback:ping>http://www.cnteachersblog.com/whjtoby/services/trackbacks/7770.html</trackback:ping><description>&lt;p&gt;&lt;a href="http://www.snxhy.com/"&gt;乐清鲜花网&lt;/a&gt;是基于 php + mysql 做的。加了好多的鲜花。&lt;/p&gt; &lt;p&gt;并且换了默认摸板，顶部加了一束玫瑰花。显的中间不怎么空。&lt;/p&gt; &lt;p&gt;批量加的鲜花里没有婚车和白事鲜花。后来手工加的。好花时间。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.snxhy.com/"&gt;乐清鲜花网&lt;/a&gt;是在建设中路的地方，中心菜市场旁边。可以代送鲜花。&lt;/p&gt; &lt;p&gt;对了,&lt;a href="http://www.snxhy.com/"&gt;乐清鲜花网&lt;/a&gt;&amp;nbsp;的网址是 &lt;a href="http://www.snxhy.com"&gt;http://www.snxhy.com&lt;/a&gt;&lt;/p&gt; &lt;p&gt;有要做网站的朋友可以继续找我呀。QQ&amp;nbsp;&amp;nbsp;&amp;nbsp; 29-40-56-34&lt;/p&gt;&lt;img src ="http://www.cnteachersblog.com/whjtoby/aggbug/7770.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>末名教师</dc:creator><title>新做了个网站-中国公文网.</title><link>http://www.cnteachersblog.com/whjtoby/archive/2009/05/06/3127.html</link><pubDate>Wed, 06 May 2009 15:51:00 GMT</pubDate><guid>http://www.cnteachersblog.com/whjtoby/archive/2009/05/06/3127.html</guid><wfw:comment>http://www.cnteachersblog.com/whjtoby/comments/3127.html</wfw:comment><comments>http://www.cnteachersblog.com/whjtoby/archive/2009/05/06/3127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnteachersblog.com/whjtoby/comments/commentRss/3127.html</wfw:commentRss><trackback:ping>http://www.cnteachersblog.com/whjtoby/services/trackbacks/3127.html</trackback:ping><description>&lt;p&gt;希望有需要的人能够用的上.忘了说网址&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.gwwcn.com"&gt;http://www.gwwcn.com&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.gwwcn.com"&gt;中国公文网&lt;/a&gt;是一家提供公文写作,公文写作格式等资料的网站,我们提供专业的公文写作指导帮助,并提供各类公文范文&lt;/p&gt;&lt;img src ="http://www.cnteachersblog.com/whjtoby/aggbug/3127.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>末名教师</dc:creator><title>四川地震灾区的人们你们要坚强，全国人民和你们在一起</title><link>http://www.cnteachersblog.com/whjtoby/archive/2008/05/14/1621.html</link><pubDate>Wed, 14 May 2008 03:14:00 GMT</pubDate><guid>http://www.cnteachersblog.com/whjtoby/archive/2008/05/14/1621.html</guid><wfw:comment>http://www.cnteachersblog.com/whjtoby/comments/1621.html</wfw:comment><comments>http://www.cnteachersblog.com/whjtoby/archive/2008/05/14/1621.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnteachersblog.com/whjtoby/comments/commentRss/1621.html</wfw:commentRss><trackback:ping>http://www.cnteachersblog.com/whjtoby/services/trackbacks/1621.html</trackback:ping><description>四川地震灾区的人们你们要坚强，全国人民和你们在一起。你们一定会挺过难关的。我在这里祝福你们。&lt;img src ="http://www.cnteachersblog.com/whjtoby/aggbug/1621.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>末名教师</dc:creator><title>我的工作室成立了.网站上线了.</title><link>http://www.cnteachersblog.com/whjtoby/archive/2008/04/12/1520.html</link><pubDate>Sat, 12 Apr 2008 10:12:00 GMT</pubDate><guid>http://www.cnteachersblog.com/whjtoby/archive/2008/04/12/1520.html</guid><wfw:comment>http://www.cnteachersblog.com/whjtoby/comments/1520.html</wfw:comment><comments>http://www.cnteachersblog.com/whjtoby/archive/2008/04/12/1520.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnteachersblog.com/whjtoby/comments/commentRss/1520.html</wfw:commentRss><trackback:ping>http://www.cnteachersblog.com/whjtoby/services/trackbacks/1520.html</trackback:ping><description>我的工作室成立了.网站上线了. 我要加油努力了.好好干活. 工作室网址 http://www.yqcomputer.cn&lt;img src ="http://www.cnteachersblog.com/whjtoby/aggbug/1520.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>末名教师</dc:creator><title>真累，每天坐电脑前面。</title><link>http://www.cnteachersblog.com/whjtoby/archive/2007/12/28/1292.html</link><pubDate>Fri, 28 Dec 2007 07:57:00 GMT</pubDate><guid>http://www.cnteachersblog.com/whjtoby/archive/2007/12/28/1292.html</guid><wfw:comment>http://www.cnteachersblog.com/whjtoby/comments/1292.html</wfw:comment><comments>http://www.cnteachersblog.com/whjtoby/archive/2007/12/28/1292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnteachersblog.com/whjtoby/comments/commentRss/1292.html</wfw:commentRss><trackback:ping>http://www.cnteachersblog.com/whjtoby/services/trackbacks/1292.html</trackback:ping><description>做网站真是体力加脑力的活啊。 腰不行了。哎，每个工作都是辛苦的。 加油吧。&lt;img src ="http://www.cnteachersblog.com/whjtoby/aggbug/1292.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>末名教师</dc:creator><title>美国信息大全-对美国感兴趣的朋友可以看看。</title><link>http://www.cnteachersblog.com/whjtoby/archive/2007/12/16/1279.html</link><pubDate>Sun, 16 Dec 2007 00:50:00 GMT</pubDate><guid>http://www.cnteachersblog.com/whjtoby/archive/2007/12/16/1279.html</guid><wfw:comment>http://www.cnteachersblog.com/whjtoby/comments/1279.html</wfw:comment><comments>http://www.cnteachersblog.com/whjtoby/archive/2007/12/16/1279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnteachersblog.com/whjtoby/comments/commentRss/1279.html</wfw:commentRss><trackback:ping>http://www.cnteachersblog.com/whjtoby/services/trackbacks/1279.html</trackback:ping><description>http://www.usainfocatalog.us/gb/ 如果要去美国旅游可一定要看了哈。&lt;img src ="http://www.cnteachersblog.com/whjtoby/aggbug/1279.html" width = "1" height = "1" /&gt;</description></item></channel></rss>