Skip to main content
pointer variable qna in c

C언어 포인터 변수 질문

char* str = "a";

str = toupper(*str); 
printf("%c\n", str);

str = tolower(str); // 여기서 왜 tolower(*str)는 안되나요?
printf("%c\n", str);

결과값:
A
a

설명:

char* str = “a”;
char* str 는 포인터 변수입니다. str에는 “a”의 주소값이 저장됩니다.

str = toupper(*str);
*str는 포인터 변수가 가르키는 값을 가지고 있으므로 ‘a’이고 toupper 함수의 리턴 값은 캐릭터의 정수값입니다. 결국 str에는 ‘A’의 정수값인 65가 저장됩니다. 

printf(“%c\n”, str);
str에는 65 정수값이 그리고 대응되는 캐릭터는 ‘A’ 그러므로 ‘A’를 출력합니다.

str = tolower(str);
str에는 65가 들어있고 소문자로 변경합니다.

여기서 질문이 tolower(*str)는 문제가되는데, 왜 그런가요?

그 이유는 현재 str에는 65라는 정수값이 들어있는데 이 말은 즉 포인터 변수인 str에 65가 저장되어 있다는 말입니다. *str는 메모리 주소가 65인 곳의 값이라는 말인데 해당 메모리 주소로는 엑세스가 불가능하기 때문에 Segmentation fault (core dumped) 에러가 발생하게 됩니다.

printf(“%c\n”, str);
결국 tolower(str)에서 받은 97 정수값인 ‘a’ 캐릭터를 출력합니다.

마무리

char* str에서 포인터 변수 str는 변수의 주소값이 저장됩니다. 그리고 toupper 함수에서 캐릭터의 정수값이 리턴되고 그 이후에는 해당 값으로 대소문자 변경하고 캐릭터로 출력하기 때문에 정상 출력이 되게 됩니다.

하지만 *str하는 시점에서 값을 가지고 오기 위해 메모리에 접근되고 결국 엑세스가 거부되게 됩니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다