c - "Ej4.exe has stopped working"– 如何使用调试器?

标签 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;
}

最佳答案

在另一个函数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 的一个小调试步骤。

关于c - "Ej4.exe has stopped working"– 如何使用调试器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48082267/

相关文章:

c - 编辑 makefile 以允许在 linux 中进行调试

c - 数学矩阵程序

c++ - 如何使用正则表达式捕获多行?

CUDA 外部纹理声明

c++ - Visual Studio Express 2010 C++ 反汇编调试

c++ - 对功能代码块的 undefined reference

C++:使用 Google Mock 和 Code::Blocks、MinGW 和 C++11 进行单元测试

c - Void * 转换为 int/char 并替换结果时出现问题

iphone - 使用指向 NSData 的指针序列化结构

调试多个exe程序