command 에 입력된 명령어를 파싱해서 전달해주는 Argument passing
즉, parsing한 후, passing 하는 것이다.
parsing 디버깅 과정에서 엄청난 것을 깨달아버렸다.
함수 호출 시 인자값은 오른쪽 -> 왼쪽 순으로 스택에 저장된다.
이걸 잘 이해하고 넘어갔는데, 디버깅 과정 중 신기한 일이 있었다.
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++
이 먼저 스택에 저장되어 우리가 원했던 결과가 나오지 않는다.
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]
값이 같게 나온다.