duddnd904   5년 전

문자열을 생성할 때 보통 char형 배열이나 포인터로 한다고 알고있습니다.
그런데 scanf에 %s로 문자열을 받으려고 할때는 char형 배열을 역시 잘돼는데 

왜 char 형 포인터로 받으면 문제가 있는건가요??? 책에도 안나오고 그래서 질문을 남깁니다. 

jung2381187   5년 전

문자열을 입력받으려면 문자열 길이만큼 공간이 할당되어 있어야 합니다. 그리고 그 공간의 첫 시작 위치를 가리키는 포인터를 만들어서 scanf에 넣어주면 알아서 공간에 문자열을 입력해줍니다. 이게 아닌 허공을 가리키는 포인터면 문자열을 입력받을 공간이 없어서 에러가 납니다.

duddnd904   5년 전

아 그러면 처음 포인터를 선언할때

char *ptr 이런식으로 두면 에러가 뜨지만
char *ptr = null 이라던가 숫자  이런식으로 두면 괜찮다는 건가요???? 

djm03178   5년 전

그래도 문제가 됩니다. NULL은 할당된 공간이 아니라 아무것도 가리키지 않는 포인터를 나타낼 때 사용하는 주소일 뿐입니다. 할당된 주소가 아니기 때문에 여기에 입력을 받으려고 시도하면 문제가 생깁니다.

포인터에 동적 할당을 해주거나, 그 포인터가 이미 할당된 다른 공간을 가리키게 한 뒤에 입력받아야 합니다.

chogahui05   5년 전

char형 포인터와 char형 배열은 차이가 있어요.

포인터 변수는 그냥 어떠한 메모리를 가리키기 위한 변수일 뿐이고..

변수의 개념부터 숙지 하시는 게 중요해 보이는데..

어떠한 함수 내에서

char *ptr;

이런 식으로 써 버리면.. ptr은 지역변수기 때문에, 쓰레기 값으로 초기화가 될 겁니다.

이 상태로 그냥 scanf("%s",ptr); 을 한다? scanf는 기본적으로 입력을 받아서 어떠한 메모리 공간에 쓰겠다는 겁니다. Write를 한다는 거죠.

어디인지도 모르는 공간에다가 write를 하겠다는 건데요. 쓰기가 금지된 영역이라면 런타임을 뱉지 않을까 싶네요.

전역 변수면 보통 0으로 초기화가 되는데..

NULL 포인터에 write를 하겠다.. 허허.. 한 번 해 보시는 것도 나쁘지 않은데. 매우 높은 확률로 런타임이 뜰 거에요.

chogahui05   5년 전

배열과 포인터 변수에 대해서 혼동하시는 거 같은데.. 

관련 자료 찾으면 많으니.. 꼭 찾아서 10번 읽어보세요.

yukariko   5년 전

부끄럽지만 
https://www.acmicpc.net/blog/v...
이런 글도 있습니다

댓글을 작성하려면 로그인해야 합니다.