现在再键入 run 命令, 将产生如下的输出:
你能通过设置一个观察 string2[size - i] 变量的值的观察点来看出错误是怎样产生的, 做法是:
现在可以用 next 命令来一步步的执行 for 循环了: (gdb) next
经过第一次循环后, gdb 告诉我们 string2[size - i] 的值是 `h`. gdb 用如下的显示来告诉你这个信息:
这个值正是期望的,后来的数次循环的结果都是正确的。当 i=10 时, 表达式 string2[size - i]的值等于 `e`, size - i 的值等于 1, 最后一个字符已经拷到新串里了。
如果你再把循环执行下去, 你会看到已经没有值分配给 string2[0] 了, 而它是新串的第一个字符, 因为 malloc 函数在分配内存时把它们初始化为空(null)字符, 所以 string2 的第一个字符是空字符,这解释了为什么在打印 string2 时没有任何输出了。
现在找出了问题出在哪里, 修正这个错误是很容易的. 你得把代码里写入 string2 的第一个字符的的偏移量改为 size - 1 而不是 size. 这是因为 string2 的大小为 12, 但起始偏移量是 0, 串内的字符从偏移量 0 到 偏移量 10, 偏移量 11 为空字符保留。
为了使代码正常工作有很多种修改办法。 一种是另设一个比串的实际大小小 1 的变量。 这是这种解决办法的代码:
#include
char my_string[]=\ my_print(my_string); my_print2(my_string); }
my_print(char *string) {
printf(\}
my_print2(char *string) {
char *string2;
int size,size2,i; size=strlen(string); size2=size-1;
string2=(char*)malloc(size + 1); for (i=0;i string2[size2-i]=string[i]; string2[size+1]='\\0'; printf(\} 4.简述GNU make的工作过程。 答:make的主要功能是执行生成新版本的目标程序所需的各个步骤,即自动检测一个大型程序的哪一部分需要重新编译,然后发出命令重新编译。GNC的make的工作过程如下: (1)依次读入每个makefile文件; (2)初始化文件中的变量; (3)推导隐式规则,并分析所有规则; (4)为所有目标文件创建依赖关系链; (5)根据依赖关系和时间数据,确定哪些文件需要重新生成; (6)执行相应生成命令。 5.makefile文件的作用是什么?其书写规则是怎样的? 答:要用make维护一个程序,必须创建一个makefile文件,makefile文件告诉make以何种方式编译源代码和链接程序。makefile有自己的书写格式、关键字、函数,像C语言有自己的格式、关键字和函数一样,makefile描述规则组成如下所示。 目标 : 依赖文件 [TAB]命令 6.设某个程序由四个C语言源文件组成,分别是a.c、b.c、c.c、d.c,其中b.c和d.c都使用了defs.h中的声明,最后生成的可执行文件名为pgm。试为该程序编写相应的makefile文件。 答: pgm : a.o b.o c.o d.o gcc -o pgm a.o b.o c.o d.o a.o : a.c gcc -c a.c b.o : b.c defs.h gcc -c b.c c.o :c.c gcc -c c.c d.o : d.c defs.h gcc -c d.c 7.编写程序,用系统调用fork()创建两子进程。父进程显示50次字符串“father”,子进程1显示50次字符串“son”,子进程2显示50次字符串“daughter”。观察并记录屏幕上显示结果,分析原因。(提示:可在各进程中加入sleep,观察结果分析原因。) 答: #include main() { int p1,p2,i,j,k; while ((p1=fork())==-1); if(p1==0) { for(i=0;i<50;i++) { printf(\ } else { while ((p2=fork())==-1); if (p2==0) { for (j=0;j<50;j++) { printf(\ } else { for(k=0;k<50;k++){printf(\ } } } 编译运行结果如下: