>  기사  >  백엔드 개발  >  C에서는 Void가 아닌 포인터에 `void*`를 할당할 수 없지만 C에서는 할당할 수 있는 이유는 무엇입니까?

C에서는 Void가 아닌 포인터에 `void*`를 할당할 수 없지만 C에서는 할당할 수 있는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-31 11:22:29223검색

  Why Can't I Assign a `void*` to a Non-Void Pointer in C  , But I Can in C?

void 포인터: C와 C 사이의 구분 공개

void 포인터의 경우 C와 C는 서로 다른 동작을 나타냅니다. 문제는 void* 반환 값을 void가 아닌 포인터에 할당하는 허용 여부와 관련이 있습니다.

C에서는 오류 없이 컴파일되는 다음 코드에서 볼 수 있듯이 이러한 할당이 허용됩니다.

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

그러나 C에서는 동일한 코드가 컴파일되지 않아 C에서 더 엄격한 유형 검사가 강조됩니다. 이러한 불일치는 void 포인터를 처리하는 방법의 차이에서 비롯됩니다.

C에서는 void와 다른 포인터 유형 간의 암시적 변환을 허용하지만 C에서는 이러한 자유가 제한됩니다. C에서는 void에서 특정 포인터 유형으로 변환하려면 명시적인 캐스트가 필요합니다. 따라서 다음 코드를 C에서 컴파일하려면 캐스트가 필요합니다.

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

이러한 차이에도 불구하고 C에서는 void가 아닌 포인터에서 void*로의 암시적 변환을 허용합니다. 이 기능은 다음 코드에서 분명하게 나타납니다.

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

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

이 코드는 C와 C 모두에서 문제 없이 컴파일됩니다. 그 이유는 void의 고유한 유연성과 포인터의 특성에 있습니다. 모든 객체 포인터는 정보 손실 없이 안전하게 void로 변환될 수 있습니다. void*가 원래 포인터 유형으로 다시 변환되면 정확한 포인터가 복원됩니다. 이는 K&R2의 인용문으로 설명됩니다.

"객체에 대한 모든 포인터는 정보 손실 없이 void * 유형으로 변환될 수 있습니다. 결과가 다시 원래 포인터 유형으로 변환되면 원래 포인터가 복구됩니다. ."

위 내용은 C에서는 Void가 아닌 포인터에 `void*`를 할당할 수 없지만 C에서는 할당할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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