make和gdb的简单应用

本文介绍了如何使用makefile来管理和编译多个源文件,包括编译、清理及安装步骤。同时,针对一个C程序的错误,通过gdb进行调试,通过修改循环索引并利用gdb的run、next和display命令观察变量变化,成功找到了并修复了字符串反转函数的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

A、以下是本次实验的内容一:

①实例文件有六个源文件 和六个头文件 分别是:func1.c  func2.c func3.c  func4.c  func5.c  main.c head1.h  head2.h  head3.h head4.h head5.h  head.h   

②编写Makefile文件,要求实现:执行make时,能对源代码进行编译、链接,生成可执行文件main.exe;执行make clean时,能清除之前编译生成的所有中间文件和可执行文件,仅保留源文件;执行makeinstall时,能在当前目录创建一个子目录bin,并且把可执行文件main.exe移动bin子目录。


解答:

可以通过 gcc -MM *.c >> makefile  得到各个文件的依赖关系。

注意:每条gcc命令 前面是一个 tab键

第一个实验通过gcc-MM func1.c >> makefile ,再通过修改makefile文件完成 在终端输入make后自动执行编译链接生成可以执行那个文件。make clean 会根据题目要求自动删除所有.o文件和可执行文件。makeinstall 会执行 mkdir bin 以及 mv main.exe ./bin/main.exe两条指令完成


makefile 文件内容:
main.exe: main.o func1.o func2.o func3.o func4.o func5.o 
        gcc -o main.exe *.o 
func1.o: func1.c head.h head1.h 
        gcc -c func1.c 
func2.o: func2.c head.h head2.h 
        gcc -c func2.c 
func3.o: func3.c head.h head3.h 
        gcc -c func3.c 
func4.o: func4.c head.h head4.h 
        gcc -c func4.c 
func5.o: func5.c head.h head5.h 
        gcc -c func5.c 
main.o: main.c head.h 
        gcc -c main.c 
clean: 
        -rm *.o main.exe 
install: 
        -mkdir bin 
        -mv main.exe ./bin/main.exe 
 



问题:

B、以下是本次实验的内容二,下面这段代码有错误,请用gdb调试,写出调试过程并修正程序。这个程序被称为 greeting,它显示一个简单的问候, 再用反序将它列出。

#include  <stdio.h>

#include  <stdlib.h>

int main (int argc, char *argv[])

{

   char my_string[] = "hellothere";

   my_print (my_string);

   my_print2 (my_string);

   exit (0);

}

 

void my_print (char *string)

  printf ("The string is%s\n", string);

}

 

void my_print2 (char *string)

{

   char *string2;

   int size, i;

   size = strlen (string);

   string2 = (char *) malloc (size +1);

   for (i =0; i < size; i++)

       string2[size - i] = string[i];

   string2[size+1] = '\0';

   printf ("The string printedbackward is %s\n", string2);

}




解答:

最终正确输出

The string ishello there

The string printedbackward is ereht olleh

错误修改如下:

for (i = 0; i <size; i++)

       string2[size - i] = string[i];

改为:


for (i = 0; i <size; i++)

       string2[size - i-1] = string[i];

 

print size 得到原来的字符串长度为11,dispaly *string2@11 用来跟踪字符串的变化,通过产看最后结果,可以发现string2的首字符始终为0,因此发现问题。

利用 run 、 next 以及display 可以查看到数组随着程序执行的变化,发现最终结果字符串string2 的整体刚好后移了1位。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值