함수 - 명시 적으로 malloc()의 반환 값을 캐스팅해야합니까?




자료 구조 malloc (3)

이 질문에는 이미 답변이 있습니다.

다음과 같은 경우에 대해 물어보고 싶었습니다.

char *temp;
temp = malloc(10);

malloc 의 반환 유형이 void* 이므로, malloc 의해 반환 된 포인터는 temp에 할당되기 전에 char* 유형으로 암시 적으로 형변환됩니까? 이와 관련하여 표준이 무엇이라고 말합니까?

포인터 변수가 다음과 같은 struct 유형 인 경우

struct node *temp;
temp = (struct node *)malloc(sizeof(struct node));

우리가 struct node* 타입으로 캐스팅하지 않고 temp에 메모리를 할당한다면, 그것은 암시 적으로 struct node* type으로 캐스팅 될 것인가 아니면 명시 적으로 struct node* type으로 캐스팅 할 필요가 있을까요?


"스스로를 반복하지 말라"는 생각이 마음에 들면, malloc() 호출에서 변수의 선언에서 유형 이름을 반복 할 필요가 없다는 사실이 매력적입니다. 사람들이 지적했듯이 포인터는 함수 포인터를 제외하고 void * 없이 void * 무손실로 변환합니다.

또한, 그 메모에, 당신은 sizeof 중 하나를 사용하여 자신을 반복하지 않아도됩니다. 두 번째 예제는 구조체를 할당 할 때 다음과 같이 작성할 수 있습니다.

struct node *temp;
temp = malloc(sizeof *temp);

그렇게 겸손한 의견으로는 최선의 방법입니다.

반복하는 것을 피하면 작성하는 물건의 수를 줄이며, 이는 다시 그 물건이 잘못되었다는 위험을 줄입니다.

sizeof 인수에서 별표를 주목하십시오. 이것은 "이 포인터가 가리키는 객체의 크기"를 의미합니다. 물론 "유형 struct node 의 크기"와 동일하지만 유형 이름을 반복하지 않습니다. 이것은 sizeof 가 인수 인 표현식의 크기를 (컴파일 타임에) 계산하기 때문입니다. 이 경우. sizeof 3 처럼 int 타입의 표현식의 크기를 계산한다. sizeof *tempstruct node 의 인스턴스 크기를 계산한다.

물론 변수 이름 자체와 같은 무언가를 반복 할 수는 있지만 일반적으로 표현이 쉽고 옳다는 것을 쉽게 알 수 있으며 컴파일러가 오류를 발견하는 것이 더 쉬울 수도 있습니다.


C ++에서 명시 적으로 캐스팅해야하지만, 실제로는이를 수행하는 데 필요한 언어 일뿐입니다.
C에서는 캐스팅 할 필요가 전혀 없으며, 메모리는 단지 메모리 일뿐입니다. 최신 C 표준에서 필요로하는지 검색하기 위해 검색을해야합니다.


C의 void 포인터는 명시 적 형변환없이 모든 포인터에 할당 될 수 있습니다.





casting