환경 : 비주얼 스튜디오 2010
제목 짓기 참 어렵네…
다름이 아니라 자주 다니는 커뮤니티에 질문이 올라왔다..
질문은 문자열 역순 출력
adsf <–입력
fsda <–출력
이런식이었다.. 뭐 그냥 배열을 하면 너무 쉬워서 동적배열로 한번 짜보았다..
하지만 여기서 의문.. 동적배열의 특징은 가변적인 입력만큼 메모리를 할당한다 라는 거다..하지만 직접 코딩을 하다보면
(char *)malloc(sizeof(char))
즉 size를 지정하게 되어있다.. 저 위 상태에서 2글자 이상 집어넣게 되면 메모리가 부족하다는 오류가 뜨게 된다..
헐..이제 알았네….
그래서 생각해 본 게 초기 배열 크기를 정하지 않고 코딩을 할 수 없을까 였다.. 그래서 한번 짜보았다.
여기서 중요한 코드가
buf = (char *)realloc(buf,strlen(buf));
이 코드다..
핵심적으로 적자면
1. realloc 함수가 성공적으로 된다면..(buf 리턴 값이 0이 아닐 경우) realloc 되기 전의 buf 에 들어있는 데이터는 초기화 되지 않는다 라는 거다..
(지금에서야 느낀거지만 당연한 것이었을듯. 왜냐하면 접근할 수 있는 주소값을 지웠다고 데이터가 사라지는건 아닐테니..)
2. 만약에 realloc이 실패한다면(buf리턴 값이 0이 될경우) 값이 buf 값이 날아가므로 실패하기 전에 buf 값을 저장해야 할 것이다(소스코드에선 구현이 되지 않았다)
3. 오류가 난다면 realloc 사이즈 크기때문이다..95% 이상.
4. realloc 함수에 사이즈 만큼 추가가 된다
buf = realloc(buf,size(char)+1); 라면 realloc안의 buf 크기에 상관없이 총 buf의 크기는 2로 변한다
buf = malloc(4);
buf=realloc(buf,size(char)+2);
이렇게 되면 buf의 크기는 3이다 6,7등등이 아니라…
뭐 이정도???
후 이것때문에 한 2시간 해맨듯..
그래도 해결했으니 다행이다.