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

오늘은 페이지에 도달 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 .

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



답변

에서 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 규칙을 잘못 표현하는 방식으로 작성되었습니다.


답변