안녕하세요.
좋은 자료 올려주셔서 잘 공부하고 있습니다.
메모리 할당 함수인 malloc 함수와 관련해서
int *a = malloc(sizeof(int)); 와
int *a = (int *)malloc(sizeof(int));
의 차이가 궁금하여 문의드립니다.
코딩 도장 내의 코드들은 전부 위의 형태의 할당 함수를 사용하는 것으로 확인했는데
일부 다른 자료를 공부하면서 아래와 같은 형태를 발견했습니다.
제가 확인한 바로는 malloc 함수의 반환값이 void형태의 포인터를 반환하기 때문에
어떤 자료형을 사용할지에 따라 코드 작성자가 용도 변환을 하는 용도라고 하는데
사용법에서 큰 차이는 없다고 느껴지지만 가독성이나 효율성에서 차이가 있을수도 있다고 생각하여 질문드립니다.
감삿합니다.
C 언어 표준을 따르지 않거나 비표준으로 작성된 C 언어 코드로 된 책들이 많고, C 언어 표준에 대해 이해하지 못하고 잘못된 텍스트로 배우고, 그게 굳어져서 그대로 C 언어 강의를 하는 경우도 많습니다.
첫 번째 코드는 C 언어 방식이고,
두 번째 코드는 C++ 방식입니다.
두 번째 코드는 C 언어에서도 동작하지만, C 언어에서는 쓰면 안 되는 방식입니다.
아직도 (int*)malloc...으로 설명하는 책이 있다면 피하는 게 좋습니다. 임베디드나 시스템 분야에서 C 언어를 업으로 쓴다면 잘못된 코드부터 배워온 신입을 교정하는 일부터 하는 게 다반사입니다.
C 언어에서 void *는 자동으로 변환되며, 안전하게 다른 포인터 타입으로 승급(promoted)됩니다.
stdlib.h를 include하지 않았다면 에러가 발생하므로 stdlib.h 헤더 파일을 포함하게 합니다.
(int*)로 캐스팅하면 stdlib.h를 쓰지 않아도 에러가 발생하지 않지만, 이는 에러가 일으킬 수 있는 가능성을 숨기게 됩니다.
두 번째 방식은 C 언어를 C++ 방식으로 컴파일할 때 경고 또는 에러를 피하는 방법입니다.
사람들은 C 언어 책이나 프로그래밍 입문서를 쉽냐, 재밌냐로 선택하지만, 틀린 내용, 잘못된 내용, 편법을 알려주는 경우가 많습니다.
이 경우에 이를 교정해줄 수 있는 고수나 스승이 주변에 없다면 책의 내용을 그대로 믿게 될 것입니다.
비슷한 예로 sizeof를 연산자(operator)가 아니라 함수(function)라고 설명하는 책도 멀리하시기 바랍니다.
(int *)malloc 방식이 c언어에서 쓰면 안되는 방식이라고 하셨는데 왜 그러한지 이유를 여쭤봐도 될까요?