char *ch = ‘c’; printf(“%c”, ch);가 왜 정상출력되는지 궁금합니다.

awidesky의 이미지

#include <stdio.h>
 
int main(void) {
char* cr = 's';
printf("%c\n", *cr);
return 0;
}

위와 같은 코드는 char 리터럴 데이터가 컴파일러 내에 존재해 실행시 segmentation fault를 일으킨다는 사실은 알고 있습니다.

#include <stdio.h>
 
int main(void) {
char* cr = 's';
printf("%c\n", cr);
return 0;
}

근데 이 코드는 실행이 멀쩡히 되네요...? 심지어 주소값을 출력했는데...?
혹시 이유를 아시는 분 계신가요..?

세벌의 이미지

컴파일 할 때 Error 메시지 뿐 아니라 Warning 메시지도 잘 보세요.
보이는 것이 전부는 아닙니다.

kldp 에 글 쓸 때 코드는 code 태그로 감싸 주세요.

라스코니의 이미지

's'와 "s"는 다릅니다.
's'는 소문자 s에 대한 ASCII 값을 돌려주고,
"s"는 s 문자가 저장되어 있는 메모리의 주소값을 돌려줍니다.

앞의 try에서 "s" 로 바꿔 보세요.

익명 사용자의 이미지

char *cr = 's' 는 char *cr = 0x73 하고 같은 것이에요
첫번째 printf 문에서 *cr 는 0x73 주소를 참조했으니 segmentation fault 가 발생하는 것이고
두번째 printf 문에서는 0x73 값을 %c 로 출력했으니 정상적으로 값이 출력되는 것이에요