C++ Segmentation fault 예외 질문입니다.

조회수 495회

먼저 코드는 다음과 같습니다.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void dfs(int x, int m, bool *visited, vector<vector<int>> &g){
    visited[x] = true;
    cout << x << endl;

    cout << "plz" << endl;

    for (int i=0; i<m; i++){ //vector g 의 원소 출력
        for (int j=0; j<2; j++){
            cout << g[i][j] << '\n';
        }
    }
}

int main(){
    freopen("input.txt", "r", stdin);

    int n, m, v;
    cin >> n >> m >> v;

    vector<vector<int>> g(m, vector<int>(2,0));
    for (int i=0; i<m; i++){
        int t1, t2;
        cin >> t1 >> t2;
        g[i][0] = t1;
        g[i][1] = t2;
    }
    sort(g.begin(), g.end());

    bool visited(n+1);

    dfs(1, m, &visited, g);

    return 0;
}

문제의 코드는 dfs함수 안의

    for (int i=0; i<m; i++){ //vector g 의 원소 출력
        for (int j=0; j<2; j++){
            cout << g[i][j] << endl;

이 부분(2중 for문) 입니다.

위 코드 전체를 제 컴퓨터 VScode에서 mingw의 g++ 컴파일러로 컴파일 한 뒤 실행하면 이미지

위 처럼 plz 까지만 출력이 되고, dfs 함수 안의 2중 for문은 실행이 되지 않습니다.

디버깅을 해보니, segmentation fault 라는 예외가 발생했다고 해요.

dev-c++ 에서 실행시켜도 똑같이 plz까지만 출력됩니다.

근데 어이가 없는건 repl.it같은 온라인 ide에서 실행하면 이미지

위 사진 처럼 결과값이 잘 나옵니다.

왜 제 컴퓨터에서만 오류가 발생할까요?

또 이상한 점은, 문제의 2중 for문을 dfs 함수를 호출해서 실행시키지 않고 main함수로 옮겨서 실행하면 결과가 잘 나옵니다.

제 코딩이 잘못됐으면 repl.it 에서도 같은 오류가 발생해야 할 것 같은데, 또 그렇진 않으니 뭐가 문젠지 모르겠습니다.

이거때문에 노트북 초기화도 했는데 그대로에요...

제가 생각하는 원인은 dfs함수에 vector g 를 매개변수로 넘길 때 뭔가가 잘못됐는데

repl.it 과 같은 사이트의 컴파일러는 모종의 이유로 알아서 잘 번역했으나, 제 g++와 dev-c++의 컴파일러는 그러지 않는다는 것 입니다.

여러분 의견은 어떠신가요? ㅠ

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기
    bool visited(n+1);
    

    위에 코드가 잘못되었습니다.

    원래 하고 싶었던 것은 bool형 배열인 visited을 선언하고 싶었던 것 같은데, 배열 선언을 하기 위해서는 소괄호(())이 아니고 대괄호([])로 해야 합니다.

    bool visited[n + 1];
    

    그런데 배열 선언은 변수를 넣어서 할수 없기때문에, 위와 같이 기술하면 에러가 되고, 동적할당으로 배열을 선언해야 합니다.

    bool* visited = new bool[n + 1];
    memset(visited, 0, n + 1);
    

    일단 위처럼 바꾸시고 실행하시면, segmentation fault는 해결됩니다.

    • 코드
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    void dfs(int x, int m, bool* visited, vector<vector<int>>& g) {
        visited[x] = true;
        cout << x << endl;
    
        cout << "plz" << endl;
    
        for (int i = 0; i < m; i++) { //vector g 의 원소 출력
            for (int j = 0; j < 2; j++) {
                cout << g[i][j] << '\n';
            }
        }
    }
    
    int main() {
        //freopen("input.txt", "r", stdin);
    
        int n, m, v;
        cin >> n >> m >> v;
    
        vector<vector<int>> g(m, vector<int>(2, 0));
        for (int i = 0; i < m; i++) {
            int t1, t2;
            cin >> t1 >> t2;
            g[i][0] = t1;
            g[i][1] = t2;
        }
        sort(g.begin(), g.end());
    
        bool* visited = new bool[n + 1];
        memset(visited, 0, n + 1);
    
        //bool visited[n + 1];
        //vector<bool> visited(n + 1);
    
        dfs(1, m, visited, g);
    
        return 0;
    }
    
    • 결과

    이미지

    vector<bool> visited(n + 1);
    

    그런데 bool형 배열을 선언하는 것보다 위와 같이 벡터로 선언하고, 아래와 같이 함수의 3번째 매개변수를 바꾸는게 더 편합니다.

    void dfs(int x, int m, vector<bool>& visited, vector<vector<int>>& g) {
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 와... 감사합니다 해결했습니다! C++은 초보라 선언하는 것도 미숙하네요... 설마 bool 배열이 잘못됐을거라곤 생각도 못했습니다. 저는 당연히 g에 문제가 있는 줄 알았는데 C++ 너무 불친절하네요 ㅡㅡ repl.it에선 어떻게 잘 동작했는지 의문이지만 답변 덕분에 헛짓하지 않고 넘어 갈 수 있게 됐어요 ㅎㅎ Hokgorny 2022.5.7 11:37

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)