되게 쉬운 문제인데, 동적 할당의 중요성과 문자열 리터럴의 특성을 공부해 볼 수 있었다.
기존 코드
sizeof(char)로 1바이트만 할당했음에도 정상작동 되길래 이상함을 느꼈다.
answer에 들어갈 값인 "Even" 이나 "Odd"는 4-5바이트가 필요하기 때문이다.(NULL을 고려하면 6)
기존 코드가 동작하는 이유:
1. 문자열 리터럴
"Even"이나 "Odd"같은 문자열 리터럴은 프로그램이 실행될 때 읽기 전용 메모리에 저장된다. 따라서 위 코드에서 answer는 실제 동적 할당된 메모리가 아닌 읽기 전용 메모리를 가리킨다.
문자열 리터럴을 할당하는 것 자체나 동작엔 문제가 없다. 포인터가 읽기 전용 메모리를 가리키는 것이기 때문에, 코드는 정상적으로 "Even" 또는 "Odd"를 반환하게 된다. 그래서 메모리를 1바이트만 할당했음에도 동작한 것이다.
하지만 이 방식은 동적으로 할당된 메모리를 제대로 사용하지 않는 것이고, 프로그램의 유지 보수 측면에서 취약할 수 있다.
2. 동작하지만 불안전함
동적 할당된 메모리 공간을 사용하지 않고 문자열 리터럴을 가리켰기 때문에, 이 메모리를 나중에 해제(free())하면 에러가 생길 수 있다. (동적 할당된 메모리가 아닌 읽기 전용 메모리 공간을 해제하면 오류가 생길 수 있다)
3.결론
동적으로 할당된 메모리를 사용하려면, 문자열 리터럴을 가리키는 대신에 할당된 메모리에 문자열을 복사(strcpy 를 사용하여)하여 사용하는 것이 좋다.
이렇게 해야 메모리 관리가 명확해지고 프로그램의 안정성이 보장된다고 한다.
최종 수정한 코드
++sizeof(char)은 c에서 항상 1이므로 생략 가능하다.
++배우고 싶은 코드
if문 안에서 할당량을 조정한 코드다. 멋있다..
'Coding > C + algorithm' 카테고리의 다른 글
프로그래머스 금과 은 운반하기(이진 탐색) (3) | 2024.10.28 |
---|---|
프로그래머스 문자열을 정수로 바꾸기('0'의 아스키 코드는 48) (0) | 2024.10.23 |
프로그래머스 모음 제거(문자열의 끝에는 '\0'을 넣자) (0) | 2024.10.22 |