“Ej4.exe已停止工作” - 如何使用调试器?

时间:2018-01-03 17:28:44

标签: c debugging codeblocks

编译以下程序时出现“Ej4.exe已停止工作”。我可以用调试器找到错误吗?我从来没有使用过它,想知道它在哪些情况下使用以及如何使用。

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

int findMaxElem(int []);

int main(){
    int arr1[MAX],mxelem,i,n;

    printf(" Ingrese el numero de elementos a almacenar en el arreglo :");
    scanf("%d",&n);

    printf(" Ingrese %d elementos en el arreglo:\n",n);
    for(i=0;i<n;i++)
    {
        printf(" elemento - %d : ",i);
        scanf("%d",&arr1[i]);
    }
    mxelem=findMaxElem(arr1);

    printf(" El maximo elemento en el arreglo es: %d\n\n",mxelem);
    return 0;

}


int findMaxElem(int arr1[])
{
    int i=1,mxelem,n;
    mxelem=arr1[0];
    while(i < n)
    {
        if(mxelem<arr1[i])
        mxelem=arr1[i];
        i++;
    }
    return mxelem;
}

1 个答案:

答案 0 :(得分:4)

在另一个函数findMaxElem()中,您使用了未初始化的n。因此,您有未定义的行为 - 以及使您的程序停止的未定义行为。 (也许垃圾值使您访问超出范围的数组访问)。这里n未初始化。将nmain传递给此函数。

mxelem=findMaxElem(n,arr1);

并使用它

int findMaxElem(int n, int arr1[])
{
   int i=1,mxelem;
   mxelem=arr1[0];
   while(i < n)
   {
      if(mxelem < arr1[i])
         mxelem = arr1[i];
      i++;
   }
   return mxelem;
}

我是如何调试它的?

>>gcc -g prog.c -o prog.x
>>gdb prog.x
(gdb) run

..

然后每次运行它都会返回0 - 元素。出了点问题。最重要的功能是findMaxElem我在那里放了一个断点。

(gdb) break findMaxElem
...

(gdb) run

现在它在我到达那里之后就停止了(我的意思是在给出输入之后)。

Breakpoint 1, findMaxElem (arr1=0xbffff1e8) at prog.c:30
30          int i=1,mxelem,n;
(gdb) next
31          mxelem=arr1[0];
(gdb) print mxelem
$3 = 1  <-- for me first element entered was 1
(gdb) next
32          while(i < n)
(gdb) print i
$4 = 1
(gdb) print n
$5 = -2147475456 <---- this gave me the idea that it is the error over here.
(gdb) 

所以答案是肯定的。您可以使用调试器找出问题所在。您没有提到您使用的调试器,但我已经使用gdb向您展示了一个小的调试步骤。