繁体   English   中英

分配给数组时出现分段错误? HackerRank 2D 数组 - DS

[英]Segmentation fault when assigning to Array? HackerRank 2D Array - DS

这是我试图在 HackerRank 上解决的问题: https://www.hackerrank.com/challenges/2d-array/problem

只是我要制作的非常粗略的映射

这是我的 function 主体:

int hourglassSum(vector<vector<int>> arr) {
    vector <int> sum;

    for(int i=0, s=0, countI=0;countI<4&&s<16;i++){  //Sums hourglass values one column  
        for(int j=0,countJ=0;countJ<4;j++){          //at a time at each row into vector sum
            sum[s]+=arr[0+i][0+j];
            sum[s]+=arr[0+i][1+j];
            sum[s]+=arr[0+i][2+j];
            sum[s]+=arr[1+i][1+j];
            sum[s]+=arr[2+i][0+j];
            sum[s]+=arr[2+i][1+j];
            sum[s]+=arr[2+i][2+j];
            countJ++;
            s++;
        }
        countI++;
    }
    sort (sum.begin(), sum.end());

    return sum.back();
}

逐行验证循环中的分配:

i=0 | j=0 | s=0 | countI=0 | countJ=0 | sum[0]=1+1+1+1+1+1+1=7
i=0 | j=1 | s=1 | countI=0 | countJ=1 | sum[1]=1+1+0+0+1+1+0=4
i=0 | j=2 | s=2 | countI=0 | countJ=2 | sum[2]=1+0+0+0+1+0+0=2
i=0 | j=3 | s=3 | countI=0 | countJ=3 | sum[3]=0+0+0+0+0+0+0=0
--------------------------------------------------------------
i=1 | j=0 | s=4 | countI=1 | countJ=0 | sum[4]=0+1+0+1+0+0+2=4
i=1 | j=1 | s=5 | countI=1 | countJ=1 | sum[5]=1+0+0+1+0+2+4=8
i=1 | j=2 | s=6 | countI=1 | countJ=2 | sum[6]=0+0+0+0+2+4+4=10
i=1 | j=3 | s=7 | countI=1 | countJ=3 | sum[7]=0+0+0+0+4+4+0=8
--------------------------------------------------------------
i=2 | j=0 | s=8 | countI=2 | countJ=0 | sum[8]=1+1+1+0+0+0+0=3
i=2 | j=1 | s=9 | countI=2 | countJ=1 | sum[9]=1+1+0+2+0+0+2=4
i=2 | j=2 | s=10| countI=2 | countJ=2 | sum[10]=1+0+0+4+0+2+0=7
i=2 | j=3 | s=11| countI=2 | countJ=3 | sum[11]=0+0+0+4+2+0+0=6
--------------------------------------------------------------
i=3 | j=0 | s=12| countI=3 | countJ=0 | sum[12]=0+0+2+0+0+0+1=3
i=3 | j=1 | s=13| countI=3 | countJ=1 | sum[13]=0+2+4+0+0+1+2=9
i=3 | j=2 | s=14| countI=3 | countJ=2 | sum[14]=2+4+4+2+1+2+4=19
i=3 | j=3 | s=15| countI=3 | countJ=3 | sum[15]=4+4+0+0+2+4+0=14
--------------------------------------------------------------

排序后 (sum.begin(), sum.end());

sum[0] = 0
sum[1] = 2
sum[2] = 3
sum[3] = 3
sum[4] = 4
sum[5] = 4
sum[6] = 4
sum[7] = 6
sum[8] = 7
sum[9] = 7
sum[10] = 8
sum[11] = 8
sum[12] = 9
sum[13] = 10
sum[14] = 14
sum[15] = 19

返回 sum.back(); 应该返回 19? 但相反,我得到分段错误错误。

下面的错误代码:

 Reading symbols from Solution...done.
[New LWP 128917]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./Solution'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000000000400ea4 in hourglassSum (arr=...) at Solution.cpp:17
17              sum[s]+=arr[2+i][2+j];
To enable execution of this file add
    add-auto-load-safe-path /usr/local/lib64/libstdc++.so.6.0.25-gdb.py
line to your configuration file "//.gdbinit".
To completely disable this security protection add
    set auto-load safe-path /
line to your configuration file "//.gdbinit".
For more information about this security protection see the
"Auto-loading safe path" section in the GDB manual.  E.g., run from the shell:
    info "(gdb)Auto-loading safe path"

int 类型的初始值向量为“0”。 你没问题,有这个概念。 但是您错过了声明向量的大小(初始)。

这是声明向量的标准语法:

vector<type> variable_name (number_of_elements);

所以你需要用这个修改你声明向量的行:

vector <int> sum(N); // N is the size of vector to be create

发生此错误的原因是超出范围的数组索引导致缓冲区溢出、未正确初始化的指针等。

当程序尝试在为其分配的 memory 之外读取或写入或写入只能读取的 memory 时,将生成一个信号。

例如,您正在使用不支持数组负索引的语言访问 a[-1]。

Errors made in the code:

  1. 您正在尝试在未初始化的 memory 位置(向量和)上写入。 所以用 16 的常量大小初始化向量。
  2. 此外,没有为 2 个for循环中的最大允许值索引ij添加条件。

查看以下已在 Hackerrank 上接受状态的代码:

#include <bits/stdc++.h>

using namespace std;

// Complete the hourglassSum function below.
int hourglassSum(vector<vector<int>> arr) {
    vector <int> sum(16);

    for(int i=0, s=0, countI=0;countI<4&&s<16;i++){  //Sums hourglass values one column  
        for(int j=0,countJ=0;countJ<4;j++){          //at a time at each row into vector sum
            if(i+2<6 && j+2<6){
                sum[s]+=arr[0+i][0+j];
                sum[s]+=arr[0+i][1+j];
                sum[s]+=arr[0+i][2+j];
                sum[s]+=arr[1+i][1+j];
                sum[s]+=arr[2+i][0+j];
                sum[s]+=arr[2+i][1+j];
                sum[s]+=arr[2+i][2+j];
                countJ++;
                s++;
            }
        }
        countI++;
    }
    sort (sum.begin(), sum.end());

    return sum.back();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM