2017-02-27 3 views
0

프로그래밍 : Bjarne Stroustrup이 C++을 사용하여 원칙 및 실습을하고 27 장에 비명을 지르는 부분이 생겼습니다.프로그래밍 원리 및 연습 제 27 악착 난 목록 실수?

struct List* lst = (List*)malloc(sizeof(struct List*)); 

이이 같이 작성해서는 안 내 질문은 : 그것은이 코드 라인

struct List* lst = (List*)malloc(sizeof(struct List)); 

내가 처음 버전으로 프로그램을 컴파일 할 때, 그것은 잘 작동하지만 내가 가진 본 malloc은 두 번째 버전으로 사용됩니다.

제 궁금한 점은 어떤 버전이 맞으며 그 차이점은 무엇입니까?

추 신 :이 책은 C++에 관한 것이지만,이 장에서는 C로 작성하는 방법을 제시하려고합니다. 따라서 실제로는 C 프로그램입니다.

+0

관용적 인 C++이가는 한 어느 쪽도 정확하지 않습니다. malloc은 생성자를 호출하지 않기 때문에 – StoryTeller

+2

C++의 발명가가 (기본적으로) C 코드를 작성하고 C 코드도 잘못되었을 수 있습니다. 어쩌면 그는 C에 대한 나쁜 예를 보여주고 C++로 작성해야하는 것과 대조하는 프로그램을 작성했을 것입니다. 문맥이 없기 때문에 책이 없거나 쉽게 사용할 수있는 것을 알기가 거의 어렵습니다. 아무 의미가있을 수있는 코드 두 줄만 있습니다. –

+1

@Someprogrammerdude는이 경우가 아니며 첫 번째 오류는 틀린가요? 여기에 너무 분명한 것을 놓치고 있습니까? –

답변

1

규칙 : 혼란 스러울 때 데이터 유형을 확인하십시오. 귀하의 경우에는

, lst 포인터, 어떤 유형 struct List의-점 변수입니다. 따라서 struct List을 보관하는 데 필요한 메모리 위치는 sizeof(struct List)입니다. 따라서 두 번째 버전은 의미가 있습니다.

는 P.S가 : 축하합니다, 당신은 그렇지 않으면 캐스트 구문 오류입니다 List은 또한 typedef로 정의된다

또한 나타납니다 : 올바른 생각했다.


참고 :

경우이 코드는 C 조각, please see this discussion on why or why not to cast the return value of malloc() and family in C.로한다.

+0

@SebTu 미안하지만 C++의 경우 IFF에서 malloc()을 사용하고 있습니다. 캐스트가 필요합니다. malloc은 void *를 반환합니다. C에서는 캐스트가 암시 적입니다. –

+1

오, 죄송합니다. 당신은 완벽합니다. – SebNag