如何解决给定c程序中的分段错误错误

时间:2016-07-27 09:03:04

标签: c segmentation-fault

这是一个程序,用于查找数组中最大数字的最大出现次数。 如何解决此中的分段错误错误? hackerrank问题

 /* given:
 1<n<10^5
 1<arrayNum[n] <10^7 */


#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main(){
signed long int max,n,d,a,arrayNum[n]; 
signed long int  max_count; scanf("%ld",&n);
for( a=0; a < n; a++)
    {   

       scanf("%ld",&arrayNum[a]);
    }


max = arrayNum[0];
max_count = 1;
for (int a = 0; a < n; ++a)
{
    if (arrayNum[a] == max)
      max_count++;
    else if (arrayNum[a] > max)
   {
       max_count = 1;
       max = arrayNum[a];
   }
   }d=max_count;
   printf("%ld",d);
     return 0;}

3 个答案:

答案 0 :(得分:2)

int main(){
  signed long int max,n,d,a,arrayNum[n];  //<< the problem is here,
                                          //   the content of n is indeterminate
                                          //   at that state
  signed long int  max_count; scanf("%ld",&n);
  ...
在用户输入arrayNum[n]的值之前,

n被声明为

只需将代码更改为:

int main(){
  signed long int max,n,d,a;
  signed long int max_count;

  scanf("%ld",&n);
  signed long arrayNum[n];
  ...

但可能还有其他问题。

正如其他人已经说过的那样:修复代码缩进。正确地嵌入/格式化代码是必不可少的,因此您的代码可以被其他人理解(甚至更重要的是您自己)。

答案 1 :(得分:0)

要解决分段错误,最好的方法是:

  1. 了解你做了什么(你真的得到你的程序的每一行吗?)。
  2. 修复编译器提供的错误和警告。
  3. 使用调试符号(-g-g3)进行编译,并使用调试器(例如 gdb )查找分段错误的位置。

答案 2 :(得分:0)

首先,您应该检查代码缩进,让我们更清楚地阅读。

然后,向我们提供有关您的段错误的更多信息:它在哪里发生?您可以使用Valgrind(在Linux上)等工具来查找此类信息。您只需使用调试标志(GCC上的-g)构建程序并使用GCC运行程序。

这里的问题是arrayNum[n],其大小为非初始化变量(n)。所以这个数组没有任何分配的空间。通过arrayNum访问scanf()会产生此段错误。