본문 바로가기
Coding/C + algorithm

프로그래머스 짝수와 홀수(동적 할당, 문자열 리터럴의 특성)

by pon9 2024. 10. 23.

 

되게 쉬운 문제인데, 동적 할당의 중요성과 문자열 리터럴의 특성을 공부해 볼 수 있었다.

 

기존 코드

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문 안에서 할당량을 조정한 코드다. 멋있다..