Malloc 반환이 무엇인지 캐스팅 해야하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1634153

  •  06-07-2019
  •  | 
  •  

문제

    int length = strlen(src);
    char *structSpace = malloc(sizeof(String) + length + 1);
    String *string = (String*) structSpace;    
    int *string = (int*) structSpace;

*나는 String이라는 구조물을 만들었습니다

도움이 되었습니까?

해결책

당신은 그렇지 않습니다. void* C에서 필요한 모든 것에 암시 적으로 캐스팅됩니다. C FAQ C. @Sinan의 대답에서 Malloc의 반환을 명시 적으로 피하고 싶은 이유는 이것이 왜 이것이 일관되지 않은지를 더 보여줍니다.

다른 팁

Malloc은 공허에 대한 포인터를 반환하기 때문에, 여기에 저장 될 데이터와 관련하여 단순히 메모리 덩어리를 할당하는 것입니다. C ++에서 반환 된 void*는 유형의 포인터에 암시 적으로 캐스트되지 않습니다. 당신의 예에서, 당신은 Malloc이 반환 한 것을 캐스팅하지 않았습니다. Malloc은 암시 적으로 Char*에 캐스트 된 void*를 반환했지만 다음 줄에서는 ... 더 이상 의미가 없습니다.

이것은 "C ++가 C의 슈퍼 세트"라고 진술하는 몇 가지 문제 중 하나입니다. C, a void 포인터는 다른 유형의 포인터에 암시 적으로 캐스트 될 수 있습니다. 그러나 C ++는 유형 안전에 대해 조금 더 엄격하므로 반품 값을 명시 적으로 시전해야합니다. malloc 적절한 유형으로. C ++ 코드가 사용하는 경향이 있기 때문에 일반적으로 이것은 큰 문제가 아닙니다. new 보다는 malloc, 타입 캐스트가 필요하지 않습니다.

C에서 Malloc에서 결과를 주조하는 것은 불필요하며 수행해서는 안됩니다. 예를 들어 그렇게하면 실패한 오류를 덮을 수 있습니다. #include <stdlib.h>, 당신은 malloc을위한 프로토 타입이 없습니다. 이는 다른 오류와 휴대 성이 부족할 수 있습니다 (이와 관련하여 최악의 범죄자는 대부분 쓸모 없다).

C ++에서는 Malloc의 결과를 시전하여 void 이외의 다른 유형에 대한 포인터에 할당해야합니다. 당신이 정말로 필요 그러나 C 또는 C ++로 컴파일 할 수있는 코드를 작성하려면 일반적으로 사용하지 않아야합니다. malloc C ++에서 전혀없고 사용을 사용하여 메모리를 할당하십시오 new.

초보자 (또는 C ++ 코더 :-))에서 이러한 종류의 C 코드를 보는 경향이 있습니다.

int main() {
    int len = 40;
    char *my_string = (char *) malloc(sizeof(char)*len);
    return 0;
}

이것은 불필요하고 악한 일입니다. stdlib.h

#include <stdlib.h>
int main() {
    int len = 40;
    char *my_string = malloc(sizeof(char)*len);
    return 0;
}

Malloc 명령을 사용한 후 캐스팅을 강력히 고려해야합니다. 그렇게하지 않으면 호환되지 않는 데이터 유형의 위험을 실행하여 오류가 발생할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top