210208 개발일지(63일차) - 컴퓨터에서 함수 호출 시, 인자 입출력 순서!(신기함 주의)

고재개발·2021년 2월 8일
0

C Language

목록 보기
12/13

팀원들과 디버깅 간, 함수의 인자 입출력 순서에 대해 신기한 점을 발견해서 기록하고자 한다.
사진 자료는 팀원의 블로그에서 얻었다. (감사합니다.)

함수 호출 시 스택에 저장되는 순서

위의 그림과 같이, function() 함수가 있다고 하자.
function(1, 2, 3)에서 매개변수 1, 2, 3은 User Stack 영역에서 3→2→1 순으로 저장이 된다. (스택은 큰 주소에서 작은 주소로 내려가면서 저장되므로)

디버깅을 하던 중, 바로 printf() 함수를 활용해서 확인해 볼 수가 있었다.

1. while문 안 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++); 
}

2. while문 안 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++;
}

위의 두 비교를 보면, 다른 값이 나온다.
주목할 부분은 1번 case의 2번째 printf()함수로, token_cnt 인자가 가장 마지막에 나오지만 User stack에는 save_arg[token_cnt-1]보다 먼저 저장된다.
따라서 출력 2번째 줄(검정 화면)의 결과 값이 1,2번 case가 다르게 나오는 것이다.

앞으로 유의하면서 프로그래밍을 하자~!

profile
고재개발

0개의 댓글