>백엔드 개발 >C++ >C와 C의 무효 포인터: 암시적 변환이 다른 이유는 무엇입니까?

C와 C의 무효 포인터: 암시적 변환이 다른 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-28 07:09:02382검색

  Void Pointers in C and C  : Why are Implicit Conversions Different?

공허 포인터 이해: C와 C의 차이점

공허 포인터는 C와 C 모두의 핵심 측면이지만 눈에 띄는 차이점이 있습니다. 그들의 취급에. 이 문서에서는 이러한 차이점을 살펴보고 모순되는 것처럼 보이는 동작이 발생할 수 있는 이유를 설명합니다.

C의 암시적 변환

C에서 특정 유형에 대한 포인터 간의 변환(예: int) 및 void 포인터(void)는 항상 암시적입니다. 이는 다음 명령문이 유효함을 의미합니다.

<code class="c">int* p = malloc(sizeof(int));</code>

malloc 함수는 void*를 반환한 다음 int* 포인터에 할당됩니다. 그러나 C에서는 이러한 암시적 변환이 허용되지 않습니다.

C의 명시적 캐스팅

C에서는 포인터에서 void 포인터로의 변환이 여전히 암시적이지만 void 포인터에서 특정 유형으로 변환하려면 명시적인 캐스트가 필요합니다. 이는 다음 코드가 C와 C 모두에서 컴파일되는 이유를 설명합니다.

<code class="c">void foo(void* vptr)
{
}

int main()
{
    int* p = (int*) malloc(sizeof(int));
    foo(p);
    return 0;
}</code>

malloc 함수는 foo 함수에 전달되는 void*를 반환합니다. int* 포인터가 void* 매개변수에 할당되더라도 C에서는 이러한 암시적 변환이 허용됩니다. 그러나 후속 p 호출에는 int* 유형에 대한 명시적인 캐스트가 필요합니다.

표준의 관점

K&R2 사양에 따르면 객체에 대한 모든 포인터는 정보 손실 없이 안전하게 void*로 변환됩니다. 또한 원래 포인터 유형으로 다시 변환하면 원래 값이 복원됩니다. C에서 표준은 모든 포인터 유형에서 void*로의 암시적 변환이 허용되도록 지정하지만 void*에서 다른 유형으로 변환하려면 명시적 캐스팅이 필요합니다.

결론

C와 C void 포인터 처리의 주요 차이점은 void*를 C의 특정 유형으로 변환할 때 명시적인 캐스팅이 필요하다는 것입니다. 이러한 보다 엄격한 접근 방식은 정의되지 않은 동작을 방지하고 C 코드에서 유형 안전성을 유지하는 데 도움이 됩니다.

위 내용은 C와 C의 무효 포인터: 암시적 변환이 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.