잡지식1
코딩문제를 풀다가 기록해놔야겠다 싶어 정리
1*1칸으로 이루어진~ board 문제를 풀다가
시뮬레이션 내용이 0~n까지 루프를 돌면서
각 칸 동작 결과값이 다른칸에 영향을 주는데, 다음 칸 동작 값은 영향 받기 전상태에서 동작해야하는 방식이었어서 결과값 새board에 갱신->원본에copy하는 식으로 적용했다.
여튼 그 이중포인터 board
갱신될 보드값 저장될 board_aft
임시저장변수 tmp_p해서
포인터 스왑하는 방식으로 board <- board_aft를 하려고했는데,
내부에서 swap 이후 함수를 빠져나오면 다시 포인터 값이 원상복구되었다.
밑에는 소스코드다.
void spread(int** board, int r, int c, int ac[]) {
int** board_aft=new int*[r];
//something ~
cout << board << " " << board_aft << endl; //#1
//swap pointer
int** tmp_p;
tmp_p = board;
board = board_aft;
board_aft = tmp_p;
tmp_p = NULL;
cout << board << " " << board_aft << endl; //#2
//delete memmory
//for (int i = 0; i < r; i++) {
// delete[] board_aft[i];
//}
//delete[] board_aft;
//delete[] tmp_p;
}
int main(void) {
int r, c, t;
cin >> r >> c >> t;
int** board = new int*[r];
spread(board, r, c, ac);
cout << board << endl; //#3
//for (int i = 0; i < r; i++) {
// delete[] board[i];
//}
//delete[] board;
return 0;
}
내가 생각한건 약간 이런거였는데,
(1) main에서 board 동적할당
(2) spread함수안에서 board_after 동적할당
(3) spread함수 안에서 board_after와 board swap
(4) main에서 변경된 메모리 이용
이었는데,
실제로는
4번이 생각과 달랐다. 주소가 원복됨.
=>
01099F48(보드) 01099F90(보드after)
01099F90(보드) 01099F48(보드after) => spread안에서는 주소값변경
01099F48(보드) => main으로 빠져나오니 원래값.
void spread(int** &board, int r, int c, int ac[]) {
해결은 위와같이 이렇게 하거나 (레퍼런스)
int** spread(int** board, int r, int c, int ac[]) {}
int main(void){
board = spread(board, r, c, ac);
}
이렇게 했는데(반환)
포인터변수도 stack에 저장되는 변수여서 value가 복사되는건데
(call by value / reference)
기초를 놓쳐서 생긴 문제였다.
코테 시험장에서 이랬으면 시간낭비해서 끝나고 엄청 후회했을 것 같다
learned lesson->기초가 이래서 중요하구나. .
회사에서는 c++을 쓰지도 않을 뿐더러 코딩도 잘 안시켜주니
그나마 코테볼때 쓰던 C++이 많이 죽어가는것같다.. 원래 뭐 잘하지도 않았지만
Author And Source
이 문제에 관하여(잡지식1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jeongsunyong/잡지식1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)