잡지식1

8252 단어 IT > 창고ITIT

코딩문제를 풀다가 기록해놔야겠다 싶어 정리

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++이 많이 죽어가는것같다.. 원래 뭐 잘하지도 않았지만

좋은 웹페이지 즐겨찾기