“C 프로그래밍 언어”책에서 malloc을 캐스팅해야한다고 왜 말합니까?


158

오늘은 페이지에 도달 167언어 (2 판 브라이언 W. 커니 핸 & 데니스 M. 리치를) 프로그래밍은 C를 하고 저자가 I 캐스팅해야한다고 발견 malloc. 이 책의 일부는 다음과 같습니다.

7.8.5 스토리지 관리

malloc 및 calloc 함수는 동적으로 메모리 블록을 얻습니다.

void *malloc(size_t n)

초기화되지 않은 스토리지의 n 바이트에 대한 포인터를 리턴하거나 요청을 충족시킬 수없는 경우 NULL을 리턴합니다.

void *calloc(size_t n, size_t size)

지정된 크기의 n 개 객체 배열에 대해 충분한 여유 공간에 대한 포인터를 반환하거나 요청을 충족 할 수없는 경우 NULL을 반환합니다. 스토리지는 0으로 초기화됩니다. malloc 또는 calloc에 ​​의해 리턴 된 포인터는 해당 오브젝트에 대한 올바른 정렬을 갖지만 다음과 같이 적절한 유형으로 캐스트되어야합니다.

int *ip;
ip = (int *) calloc(n, sizeof(int));

나는 이미 malloc(그리고 그 가족) 유형이 void *를 반환 한다는 것을 알고 있으며 , 왜 캐스팅하지 않는지에 대한 좋은 설명이 있습니다malloc .

그러나 내 질문은 : 왜 책은 내가 그것을 캐스팅해야한다고 말합니까?


125
책이 오래 되었기 때문입니다.
Oliver Charlesworth

12
태양조차도 어두운 점이 있기 때문에 내 대답이 될 것입니다. 다시 말해, 그 책은 잘못되었습니다. 텍스트가의 시맨틱보다 먼저 void *업데이트되어 업데이트되지 않았을 수 있습니다. 이 답변 도 참조하십시오 .
언 와인드

8
@Michi이 책에는 많은 사실적 및 인쇄상의 오류 (Google K & R 정오표)가 있으며, C90 표준과 다소 호환되며, 현재 C 표준이나 1990 년 이후 언어의 변경 사항을 다루지 않습니다. 잘못된 프로그래밍 연습, 잘못된 스타일 및 코드는 잘못 지정된 동작에 의존합니다. 전문 C 프로그래머가 되려면 모든 것을 배워야합니다.
Lundin

8
... 그리고 이것을 malloc의 결과를 캐스팅하지 않을 때 컴파일러가 불평 하는 이유는 무엇입니까? 따라서 C의 경우 캐스팅하지 마십시오. C ++의 경우 캐스트이지만 C ++이 아니기 malloc때문에 사용 하지 마십시오. 필요한 경우를 제외하고는 제외해야합니다. 그러나 제외해야합니다 ... AGGGHHHHHH !!!!! :-)
Bob

2
@Mandrill 내 질문을 읽었습니까? 나는 당신을 위해 나의 질문을 편집해야했다.
Michi

답변:


215

에서 http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm :

ANSI 이전 C에서 K & R-1에 설명 된 것처럼 malloc ()은 a를 반환 char * 했으며 수신 변수도 a가 아닌 모든 경우에 반환 값을 캐스팅해야했습니다 char *. void *표준 C 의 새로운 유형은 이러한 왜곡을 불필요하게 만듭니다.

K & R-2의 방어에 불필요하게 도약하는 것을 당황스럽게 만들지 않기 위해 Dennis Ritchie에게 142 페이지에서 인용 한 문장의 타당성을 인용 할 수 있다고 의견을 물었습니다.

어쨌든 이제는 p. 142, 그것이 잘못되었다고 생각합니다. 그것은 이전의 규칙에 대해 방어 적이 지 않고 ANSI 규칙을 잘못 표현하는 방식으로 작성되었습니다.


23
따라서 malloc의 리턴 유형은 char 이고 void가 아닙니다 . 감사합니다.
Michi


18
옆에 종이에 인쇄 된 정오표가 없으면이 책을 읽지 말아야합니다.
Lundin

4
@Michi-아니오, 반환 유형은 char*아닙니다 char. 둘은 크게 다릅니다.
피트 베커

20
@alk : 정확히. K & R을 읽음으로써 당신은 두 명의 전문가를 듣게됩니다. ;-)
Steve Jessop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.