C++ Segmentation fault 예외 질문입니다.
조회수 497회
먼저 코드는 다음과 같습니다.
#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 답변
-
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) {
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력