[pintOS] Project2-1. Argument passing - 신기했던 점

예니·2021년 2월 15일
0

pintOS프로젝트

목록 보기
5/6

📅 기간 : 2021.02.04(목) ~ 2021.02.05(금)

command 에 입력된 명령어를 파싱해서 전달해주는 Argument passing
즉, parsing한 후, passing 하는 것이다.

parsing 디버깅 과정에서 엄청난 것을 깨달아버렸다.

1. 함수 호출 시, 인자 순서


함수 호출 시 인자값은 오른쪽 -> 왼쪽 순으로 스택에 저장된다.

이걸 잘 이해하고 넘어갔는데, 디버깅 과정 중 신기한 일이 있었다.

printf 함수 안에서 token_cnt++을 해준 경우

 while(save_ptr != NULL){
        save_ptr = strtok_r(NULL, " ", &next_ptr);
        save_arg[token_cnt-1] = save_ptr;
        printf("save_ptr : %s, %d\n", save_ptr, token_cnt);
        // token_cnt++ 주목!
        printf("........ : %s, %d\n", save_arg[token_cnt-1], token_cnt++); 
    }

save_arg[token_cnt-1] = save_ptr; 을 printf 전에 해줬으므로 당연히 두 값이 똑같이 출력될 것으로 예상했지만 두 값이 다르게 나왔다.
왜냐하면, 함수 호출 시 인자가 오른쪽->왼쪽 순서로 저장되기 때문이다!
우리는 save_arg[token_cnt-1]save_ptr과 똑같이 출력될 것으로 생각하지만, 실제로는 인자 save_arg[token_cnt-1]보다 인자 save_ptr++이 먼저 스택에 저장되어 우리가 원했던 결과가 나오지 않는다.

printf 함수 밖에서 token_cnt++을 해준 경우

 while(save_ptr != NULL){
        save_ptr = strtok_r(NULL, " ", &next_ptr);
        save_arg[token_cnt-1] = save_ptr;
        printf("save_ptr : %s, %d\n", save_ptr, token_cnt);
        printf("........ : %s, %d\n", save_arg[token_cnt-1], token_cnt);
        // token_cnt 를 printf 밖으로 
        token_cnt++;
    }


위와 같이, printf 함수 밖에서 token_cnt++를 수행하면 정상적으로 save_ptr값과 save_arg[token_cnt - 1]값이 같게 나온다.

0개의 댓글