简体   繁体   English

无法解决 memory 读取和分段错误 C++ 中的错误

[英]Unable to resolve memory read and segmentation fault error in C++

I am coding a solution program for leetcode.我正在为 leetcode 编写一个解决方案程序。 I have encountered memory read errors and segmentation fault errors which I am unable to resolve.我遇到了无法解决的 memory 读取错误和分段错误错误。 I have tried tinkering with the code to try and remove the errors.我尝试修改代码以尝试删除错误。
For example: in the numIslands function's last lines, I had tried declaring coordinates as an array rather than a pointer but the results did not change.例如:在numIslands函数的最后几行中,我尝试将coordinates声明为数组而不是指针,但结果没有改变。
*(last + 1) = *(coordinates + 1); does not seem to work at all in the numIslands function.numIslands function 中似乎根本不起作用。 I am totally blank about what to do next.我对接下来要做什么完全空白。

#include <iostream>
#include <string>
#include <vector>
#include <map>

namespace p200 {
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;
    using std::vector;
    using std::map;
}

class Solution {
private:
    int count_islands = 0;
    
public:
    int *last;
    int numIslands(vector<vector<char>>& grid) {
        if (grid.size() == 0) return count_islands;
        if (grid.size() == 1 && grid[0].size() == 1) return grid[0][0] - 48;
        vector<vector<int>> grid_copy;
        vector<int> in;
        for (size_t index = 0; index < grid.size(); ++index) {
            for (size_t index0 = 0; index0 < grid[index].size(); ++index0) {
                (grid[index][index0] == '0')
                    ? in.push_back(0)
                    : in.push_back(INT_MAX);
            }
            grid_copy.push_back(in);
            in.clear();
        }
        int * coordinates = new int[2];
        *coordinates = 0;
        *(coordinates + 1) = 0;
        last = new int[2];
        *last = *coordinates;
        *(last + 1) = *(coordinates + 1);
        find_island(grid_copy, coordinates);
        return count_islands;
    }

    void find_island(vector<vector<int>> & arg_grid, int* arg_coordinates) {
        if (arg_grid[*arg_coordinates][*(arg_coordinates + 1)] == INT_MAX) {
            *last = *arg_coordinates;
            *(last + 1) = *(arg_coordinates + 1);
            map_island(arg_grid, arg_coordinates, 1);
        } else {
            if (*(arg_coordinates + 1) < arg_grid[*arg_coordinates].size()) {
                *(arg_coordinates + 1) = *(arg_coordinates + 1) + 1;
                find_island(arg_grid, arg_coordinates);
            }
            if (*(arg_coordinates + 1) == arg_grid[*arg_coordinates].size()) {
                if (*arg_coordinates == arg_grid.size()) return;
                *arg_coordinates = *arg_coordinates + 1;
                *(arg_coordinates + 1) = 0;
                find_island(arg_grid, arg_coordinates);
            }
        }   
    }

    void map_island(vector<vector<int>> & arg_grid, int* arg_coordinates, int arg_new) {
        arg_grid[*arg_coordinates][*(arg_coordinates + 1)] = count_islands + (arg_new * 1);
        if (arg_new) count_islands = count_islands + 1;
        if (*arg_coordinates != 0 && *arg_coordinates - 1 == INT_MAX) {
            *arg_coordinates = *arg_coordinates - 1;
            map_island(arg_grid, arg_coordinates, 0);
            *arg_coordinates = *arg_coordinates + 1;
        }
        if ((*arg_coordinates < arg_grid.size() - 1)
             && *arg_coordinates + 1 == INT_MAX) {
            *arg_coordinates = *arg_coordinates + 1;
            map_island(arg_grid, arg_coordinates, 0);
            *arg_coordinates = *arg_coordinates - 1;
        }
        if (*(arg_coordinates + 1) != 0 && *(arg_coordinates + 1) - 1 == INT_MAX) {
            *(arg_coordinates + 1) = *(arg_coordinates + 1) - 1;
            map_island(arg_grid, arg_coordinates, 0);
            *(arg_coordinates + 1) = *(arg_coordinates + 1) + 1;
        }
        if (*(arg_coordinates + 1) < arg_grid[*arg_coordinates].size() - 1
            && *(arg_coordinates + 1) + 1 == INT_MAX) {
            *(arg_coordinates + 1) = *(arg_coordinates + 1) + 1;
            map_island(arg_grid, arg_coordinates, 0);
            *(arg_coordinates + 1) = *(arg_coordinates + 1) - 1;
        }
        find_island(arg_grid, last);
    }
};


int main() {
    vector<vector<char>> input;
    input.push_back(vector<char>({'1','1','1','1','0'}));
    input.push_back(vector<char>({'1','1','0','1','0'}));
    input.push_back(vector<char>({'1','1','0','0','0'}));
    input.push_back(vector<char>({'0','0','0','0','0'}));
    Solution solver;
    cout << "Number of Island: " << solver.numIslands(input) << endl;
    return 0;
}

I have ran it through gdb.我已经通过 gdb 运行它。 After a bit of digging, the error is this:经过一番挖掘,错误是这样的:

    void find_island(vector<vector<int>> & arg_grid, int* arg_coordinates) {
        if (arg_grid[*arg_coordinates][*(arg_coordinates + 1)] == INT_MAX) {
            *last = *arg_coordinates;
            *(last + 1) = *(arg_coordinates + 1);
            map_island(arg_grid, arg_coordinates, 1);
        } else {
            if (*(arg_coordinates + 1) < arg_grid[*arg_coordinates].size()) {
                *(arg_coordinates + 1) = *(arg_coordinates + 1) + 1;
                find_island(arg_grid, arg_coordinates);
            }
            if (*(arg_coordinates + 1) == arg_grid[*arg_coordinates].size()) {
                if (*arg_coordinates == arg_grid.size()) return;
                *arg_coordinates = *arg_coordinates + 1;
                *(arg_coordinates + 1) = 0;
                find_island(arg_grid, arg_coordinates);
            }
        }
    }

In the second if , you do a bounds check and then increment.在第二个if中,您进行边界检查,然后递增。 You should first increment then to the bounds check, like this:您应该首先增加边界检查,如下所示:

*arg_coordinates = *arg_coordinates + 1;
if (*arg_coordinates == arg_grid.size()) return;

Also please use vector.at() instead of operator[] .也请使用vector.at()而不是operator[] It produces more readable and easier to interpret debug messages.它产生更具可读性和更容易解释调试消息。 Also as other people pointed it out *(arg_coordinates + 1) = arg_coordinates[1] , which would make for a more readable code.同样正如其他人指出的那样*(arg_coordinates + 1) = arg_coordinates[1] ,这将使代码更具可读性。

For other similar issues I recommend a debugger.对于其他类似的问题,我推荐使用调试器。

Edit: I ran the code and realised that there is some other bug within it.编辑:我运行代码并意识到其中还有其他一些错误。 One of the islands is counted twice, so it gives the wrong result, but that is not technically the issue at hand.其中一个岛屿被计算了两次,因此它给出了错误的结果,但这在技术上不是手头的问题。

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

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