【问题标题】:what is segmentation fault什么是分段错误
【发布时间】:2021-07-12 01:47:28
【问题描述】:

从 1 索引的零数组和操作列表开始,对于每个操作,在两个给定索引之间的每个数组元素中添加一个值,包括两个给定索引。执行完所有操作后,返回数组中的最大值。

我的代码是:

#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int n,b;
    scanf("%d",&n);
    scanf("%d",&b);
    int arr[3][b];
    for(int i=0;i<b;i++)
    {
        for(int j=0;j<3;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    int man[n];
    for(int i=0;i<n;i++)
    man[i]=0;
    int start,end,change;
    for(int i=0;i<b;i++)
    {
        start=arr[i][0]-1;
        end=arr[i][1]-1;
        change=arr[i][2];
        for(int j=start;j<=end;j++)
        {
            man[j]=man[j]+change;
            //printf("%d",change);
        }
    }
    for(int i=0;i<n-1;i++)
    for(int j=0;j<n-i-1;j++)
    if(man[j]<man[j+1])
    {
        int temp=man[j+1];
        man[j+1]=man[j];
        man[j]=temp;
    }
    printf("%d",man[0]);
}

其中一个输入是

40 30
29 40 787
9 26 219
21 31 214
8 22 719
15 23 102
11 24 83
14 22 321
5 22 300
11 30 832
5 25 29
16 24 577
3 10 905
15 22 335
29 35 254
9 20 20
33 34 351
30 38 564
11 31 969
3 32 11
29 35 267
4 24 531
1 38 892
12 18 825
25 32 99
3 39 107
12 37 131
3 26 640
8 39 483
8 11 194
12 37 502

当 n 和 b 的值较低时,我的代码会被执行,但当值较高时,它会显示 分段错误

谁能帮帮我?

【问题讨论】:

  • 发布所用输入的确切文本。
  • 使用调试器查找导致段错误的行。并在此时显示相关的变量值。
  • 有一个关于segmentation fault的维基百科页面。你读过它吗?使用GCC 作为gcc -Wall -Wextra -g 调用来编译您的代码,然后使用GDB 调试器。阅读 C 编译器和调试器的文档
  • @chux-ReinstateMonica 发布
  • SO 不是增量调试服务。您的编辑使答案无效,使当前和未来的用户感到困惑。回滚..

标签: c segmentation-fault


【解决方案1】:

至少这个问题:错误的数组维度。

// int arr[3][b];
int arr[b][3];

for(int i=0;i<b;i++) {
    for(int j=0;j<3;j++) {
        scanf("%d",&arr[i][j]);
    }
}

【讨论】:

  • @Baba_yaga 在man[j]=man[j]+change; 之前,添加assert(j &gt;= 0 &amp;&amp; j &lt; n); 以测试那里的数组访问。
【解决方案2】:

如果您尝试访问未正确分配的内存,则会发生分段错误(至少在您的情况下)。例如。您的 arr 在其第一维中的长度为 3 个整数。因此,如果您输入 b 并且它大于 2,则嵌套循环将在您到达 scanf("%d", &amp;arr[something bigger than or equal to 3][j]) 时失败。可能您需要切换循环?还是数组维度?

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2019-01-07
    • 2013-06-16
    相关资源
    最近更新 更多