【问题标题】:how to resolve the segmentation fault error in the given c program如何解决给定c程序中的分段错误错误
【发布时间】:2016-07-27 09:03:04
【问题描述】:

这是一个查找数组中最大数的最大出现次数的程序。 如何解决此中的分段错误错误?黑客等级问题

 /* 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;}

【问题讨论】:

  • 从学习C开始。你认为这条线在做什么? signed long int max,n,d,a,arrayNum[n];

标签: c segmentation-fault


【解决方案1】:
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];
  ...

不过可能还有其他问题。

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

【讨论】:

    【解决方案2】:

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

    1. 了解您的工作(您真的了解程序的每一行的作用吗?)。
    2. 修复编译器给出的错误和警告。
    3. 使用调试符号(-g-g3)进行编译,并使用调试器(例如 gdb)找出您的分段错误在哪里。

    【讨论】:

    • 这更适合评论而不是回答。
    • 我同意如果问题类似于“为什么会崩溃”或“我的段错误在哪里”,这将更适合发表评论。但这里的问题是“如何解决段错误?”。遵循这些步骤将解决段错误。那是我决定将其发布为答案(但这是一个敏感的选择)。
    【解决方案3】:

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

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

    这里的问题是arrayNum[n],它的大小与未初始化变量 (n) 相同。所以这个数组没有任何分配的空间。通过scanf() 访问arrayNum 会创建此段错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      相关资源
      最近更新 更多