Download now or listen on posterous
August Rush - Gibson J200.MP3 (9268 KB)
August Rush - Gibson J200.MP3 (9268 KB)
测试代码附在下方,通过简单的例子加深对printf 和Segmentation fault的理解。
先看 part 1和 part 2,意在加深对printf()打印字符串的过程的理解。可以首先看一下这篇文章:printf 源码分析[link]。抽出和打印字符串相关的代码:
chptr = va_arg (ap, unsigned char*); // chptr 指向待处理字符串的地址
i = 0;
while (chptr [i]) {
cnt_printed_chars++;
putchar (chptr [i++]);
}
容易看出printf打印字符串的过程:chptr地址存储的char值不为0时,调用putchar(*chptr)打印出字符。当遇见第一个为0的字符时打印过程结束。所以 part 1 和 part 2输出结果为:
part 1:
Feng Yi
part 2:
Feng Yi@@
part3和part4,意在说明putchar()可以用于单个char的输出(当然printf(”%c”,))也可以),参数类型为char值。printf(str) 不能用于单个字符输出,参数数值是指向char类型数值的指针。实际上part4会产生Segmentation-fault[介绍段错误的文章],原因是由于值为’F'的内存地址是不能使用的。事实上类似于 printf((int)a);的操作很有可能产生段错误。段错误会中断整个程序,所以如果要调试part5 & part6 的结果可以先把part4 屏蔽了。
NULL(0)对应的内存地址是否能够读写和平台有一定的关系。如果所在的平台不允许NULL内存地址读写,part 6会产生segmentation fault。在GCC 4.3 Linux 环境下,NULL对应的内存地址可以读取数值为0(但是不允许写),测试程序没有产生段错误。由于NULL的值为0,part5的为空输出。
#include
#define next() printf("\n\n")
char str[]=”Feng Yi”;
char *char_p;
int main(void)
{
//part 1
printf(”part 1: \n”);
printf(str);
next();
//part 2
printf(”part 2: \n”);
int len = strlen(str);
str[len]=’@';
str[len+1]=’@';
str[len+6]=’@';
printf(str);
next();
//part 3
printf(”part 3: \n”);
char_p=str;
putchar(*char_p);
next();
//part 4
printf(”part 4: \n”);
char_p=str;
printf(*char_p);
next();
//part 5
printf(”part 5: \n”);
//*char_p = NULL;
printf(NULL);
next();
//part 6
printf(”part 6: \n”);
char_p = NULL;
//char_p=’T'; //不允许写,会产生段错误
printf(char_p);
next();
return 1;
}
这里介绍使用数组解决问题的一则分析方法,来源于C陷阱与缺陷和平时的编程经验。
在使用数组分析问题过程中,最难以察觉的一类错误是“栏杆错误”,也常被称为“差一错误”。提两个这种错误的简单例子:
1. 每隔10米需要一根栏杆,100米长的围栏需要几根栏杆?
2. x>=245 && x<=1233 (x 为整数) , x的取值个数为?
上面两个问题的答案容易得出,提炼一下分析这类问题的方法也许可以提高分析速度,减少错误出现的可能。
所谓不对称边界,即:用第一个入界点[作为上界]和第一个出界点[作为下界]表示一个数值的范围。相应的,对称边界:用第一个入界点[作为上界]和最后一个界内点[作为下界]表示一个数值范围。
C语言中数组的定义满足不对称边界:int data[N] 上界 :0 ; 下界: N ; 数据访问范围为 data[0] - data[N-1]。注意下界是出界点,所以使用data[N] 访问内存空间会产生致命的错误。C语言中数组的这种不对称边界设计正是其最大优势所在。不仅清楚的表明了数组成员的个数,而且采用了不对称边界的模型,从而大大降低了使用数组分析问题的难度。所以在进行程序编写的时候,要利用好数组的这种特性,比如在使用for循环结构索引数组时,要保持 0 - [N-1] 的结构。
不对称边界有效简化分析问题的难度:
1. 取值范围的大小就是上界和下界之差。
2. 取值范围为空,那么上界等于下界。
3. 即使取值范围为空,上界也永远不可能小于下界。
现在分析上面提到的两个问题:
问题1. 上界: 0米处的栏杆,下界:110米处的栏杆。栏杆数目为 (110-0)/10。
问题2. 上界245 ,下界1234; 取值范围: 1234-245=989。
Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!
特地把这篇系统文章保留,纪念2009年的儿童节我的第一个wordpress诞生 :D 当然咯,这一切都是在blankyao 同学的帮助下完成的,对于建立站点我什么都不懂吶。yao 教会我怎么一步一步用wordpress建立站点,还把他的空间给我一部分用,再次感谢