首页 > 解决方案 > 如何修复代码中的分段错误?

问题描述

样本输入

3
11 2 4
4 5 6
10 8 -12
样本输出

15
解释

主对角线是:

11
5
-12
主对角线总和:11 + 5 - 12 = 4

次对角线是:

4
5
10
对角线的总和:4 + 5 + 10 = 19
差:|4 - 19| = 15

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    int i, j;
    int arr[i][j];
    int x1 = 0, x2 = 0;
    for (i = 1; i <= n; ++i)
    {
        for (j = 1; j <= n; ++j)
        {
            cin >> arr[i][j];
        }
    }
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
        {
            if (i == j)
                x1 = x1 + arr[i][j];
        }
    }
    for (i = 1; i <= n; i++)
    {
        for (j = n; j <= 1; j--)
        {
            x2 = x2 + arr[i][j];
        }
    }
    cout << abs(x1 - x2);
}

标签: c++segmentation-faultdiagonal

解决方案


这是您更正的代码:

1) 首先,您已经声明了一个垃圾大小的二维数组。

2) 其次,在除 MATLAB 之外的大多数编程语言中,数组索引都是从 0 开始的。

3) 始终使用预增量,除非后增量不是绝对必要的。

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int i, j;
    int arr[n][n];
    int x1 = 0, x2 = 0;
    for (i = 0; i < n; ++i)
    {
        for (j = 0; j < n; ++j)
        {
            cin >> arr[i][j];
        }
    }
    for (i = 0; i < n; ++i)
    {
        for (j = 0; j < n; ++j)
        {
            if (i == j)
                x1 += arr[i][j];
        }
    }
    for (i = 0; i < n; ++i)
    {
        for (j = 0; j < n; ++j)
        {
            if(i + j == n - 1)
                x2 += arr[i][j];
        }
    }
    cout << abs(x1 - x2);
    return 0;
}

PS:您的代码格式有很多改进范围。


推荐阅读