궁금한 건, 문자열을 포인터를 이용해서 저장할 때 왜 char형 포인터(pointer to char)를 사용하는가 입니다. 문자열은 메모리 공간의 한 부분에 저장되고, 그 저장된 공간의 주소값을 char형 포인터에 넣음으로써 문자열을 저장한다는건데, 왜 하필 char인지 모르겠습니다. char은 1바이트인데, 1바이트로도 주소값을 저장하는 데 충분하기 때문인가요?
제가 코딩도장 교재로 c언어 배우기 전에 다른 교재 하나를 썼었는데, 그 교재에서 포인터를 설명하는 방법을 빌리자면, char *p 는 변수 p가 가리키는 대상에 들어있는 값의 자료형이 char 입니다. 그런데, 문자열을 저장한다는 것은, 말 그대로 두 개 이상의 문자이므로 최소 2바이트라는 건데(영문자일 경우), 어떻게 char형 포인터로 문자열을 저장하는지 이해가 안갑니다....
pointer to char로 문자열을 가리킵니다.
printf로 출력할 때 %c, %s냐에 따라 다르겠지요.
%c는 문자를 기대하니까 char이고, char 타입만 값으로 줘야 합니다. 그러니 문자 하나 출력입니다.
C 언어는 문자열 타입이 없고, char*로 표현합니다. 다만, char*로 시작 주소에 가서 모든 메모리를 몽땅 다 출력합니다.
언제까지? 끝에 널 문자 \0가 있을 때까지.
%c, %s 차이는 이전 답변에 충분히 답이 되어 있을 겁니다.
char *msg = "Hello";
msg[1]로 가면 char이고, msg로 가면 문자열이죠. 끝.
저기 혹시 끝에 널 문자 안 들어가면 어떻게 되나요?
C 언어는 \0 널 문자가 없으면 해당 범위를 넘어서도 메모리를 읽을 수 있고 쓸 수 있습니다.
그래서 악명 높은 string overflow 문제를 일으킵니다.
"Hello"이면 5개의 문자 + 끝에 널문자로 총 6바이트가 할당됩니다.
Hello를 출력하고 \0을 만나서 종료되는 것인데 널이 없는 경우가 발생하면 Hello 이후에도 다른 영역의 메모리를 침범해서 출력하게 됩니다.
string overflow로 검색하면 매우 많은 예제, 설명이 나옵니다만, 이건 보안 분야에서 고민할 사안입니다.
지금은 올바른 사용법만 익히면 됩니다. 올바른 사용법으로 쓰면 보안 문제는 안 생기겠죠. 아니면 덜 생기거나.
string overflow, buffer overflow, stack overflow 등등... 많은 보안문제가 있고, 방지하는 코딩 방법이 있고... 이것 역시 한 학기 수업 과목입니다.
<컴퓨터 보안> 과목을 수강하시면 됩니다.
http://www.kocw.net/home/cview.do?cid=e6e9298d8f38b9fd
지금은 입문 단계이니 문법 올바르게 익히고 올바르게 코드 작성하는 법만 익히면 됩니다.
해커가 목표이면 언어 빠르게 익히고 보안 공부해서 해킹으로 넘어가시면 됩니다.
지금 기어가는 것도 못하는데 걷고 뛰고 하는 건 무리입니다. 일단 열심히 기어갑시다.