안녕하세요. 우선 코딩도장 사이트를 만들어주셔서 감사드립니다. 늘 C언어 공부에 큰 도움을 받고 있습니다.
다름이 아니라 제가 C언어를 공부하던 도중 Unit 49.1 부분에서 의문이 생겨 이렇게 글을 쓰게 되었습니다.
구조체 포인터를 선언하고 메모리를 할당할 때
struct 구조체이름 *포인터이름 = malloc(sizeof(struct 구조체이름));
와 같은 선언을 한다고 되어있는데 이 부분이 조금 헷갈립니다.
예를 들어, 예제에서 구조체 Person을 정의하고 그 구조체의 포인터에 동적할당할 때
struct Person *p1 = malloc(sizeof(struct Person));
라고 쓰여있는데 이 부분에서 p1은 포인터이기 때문에, 구조체의 크기만큼 동적할당한 공간을 가리키도록 (struct Person *)가 붙어야 하지 않은가 하는 의문이 생깁니다. (아래와 같은 형식)
struct Person *p1 = (struct Person *)malloc(sizeof(struct Person));
여기서 (struct Person *)가 붙지 않고 그대로 구조체 Person의 크기만큼 동적할당한 공간을 그대로 포인터 p1에 할당하는 이유는 무엇인가요?
그럼 답변 기다리고 있겠습니다!
C 언어와 C++는 void *를 처리하는 방법이 다릅니다.
malloc 함수 할당 다음에 형변환을 하는 것은 C++ 스타일입니다.
다음은 C 언어 스타일입니다. C++에서는 이와 같이 쓰면 에러가 발생합니다.
struct 구조체이름 *포인터이름 = malloc(sizeof(struct 구조체이름));
다음은 C++ 언어 스타일입니다. C 언어에서는 이와 같이 쓰면 에러가 발생합니다. Visual Studio에서 확장자를 .cpp로 하면 에러가 발생하는 이유입니다. UNIT 35.1을 보세요.
struct Person *p1 = (struct Person *)malloc(sizeof(struct Person));
C 언어 책에서 malloc으로 할당하면서 형변환을 하는 것은 C 언어에서 C++ 스타일로 코드를 작성하는 것입니다. 이렇게 설명하는 C 언어 입문서가 시중에 많습니다. 입문자에게 잘못된 지식을 가르치고 있습니다.
C 언어를 제대로 학습하려면 <C 언어 코딩 도장>을 처음부터 순차적으로 학습하는 게 더 낫습니다. 굳이 이 책이 아니어도 되지만, C 언어 표준을 제대로 따르고 설명하는 입문서를 찾기 어렵습니다.