Program Club

null 포인터와 void 포인터의 차이점은 무엇입니까?

proclub 2020. 12. 3. 20:48
반응형

null 포인터와 void 포인터의 차이점은 무엇입니까?


Null 포인터Void 포인터 의 차이점은 무엇입니까?


널 포인터포인터 의 특수 예약 된 입니다. 모든 유형의 포인터에는 예약 된 값이 있습니다. 정식으로, 각각의 특정 포인터 타입 ( int *, char *등)은 자신의 전용 널 포인터 값을 갖는다. 개념적으로 포인터가 널값을 가질 때 아무데도 가리 키지 않습니다.

Void 포인터 는 특정 포인터 유형 -- void *특정 유형이없는 저장소의 일부 데이터 위치를 가리키는 포인터입니다.

따라서 다시 한 번 null 포인터 이고 void 포인터유형 입니다. 이러한 개념은 완전히 다르며 비교할 수 없습니다. 이는 본질적으로 귀하의 질문이 정확히 유효하지 않다는 것을 의미합니다. 예를 들어 "삼각형과 자동차의 차이점은 무엇입니까?"라고 묻는 것과 같습니다.


두 가지 다른 개념이 있습니다. "void pointer"는 유형 (void *)입니다. "널 포인터"는 값이 0 (NULL) 인 포인터입니다. 예:

void *pointer = NULL;

그것은 NULL void 포인터입니다.


널 포인터는 객체에 대한 포인터와 동일하게 비교되지 않습니다. 실제 값은 시스템에 따라 다르며 유형에 따라 다를 수 있습니다. int포인터 를 얻으려면

int* p = 0;

malloc실패시 널 포인터가 리턴됩니다 .

포인터가 null인지, 즉 malloc단순히 부울 값을 테스트하여 다른 함수가 실패 했는지 테스트 할 수 있습니다 .

if (p) {
    /* Pointer is not null */
} else {
    /* Pointer is null */
}

void 포인터는 모든 유형을 가리킬 수 있으며 참조 된 객체가 역 참조 및 포인터 산술을 위해 소비하는 메모리 양을 처리하는 것은 사용자에게 달려 있습니다.


Void는 유형을 나타냅니다. 기본적으로 그것이 가리키는 데이터 유형은 알 수 없습니다.

Null은 값을 나타냅니다. 본질적으로 아무것도에 대한 포인터이며 사용할 수 없습니다.


널 포인터 포인트 NULL는 일반적으로 0 인 을 갖지만 어떤 경우에도 역 참조에 유효하지 않은 메모리 위치입니다. void 포인터는 void 유형의 데이터를 가리 킵니다. "void"라는 단어는 포인터가 참조하는 데이터가 유효하지 않거나 포인터가 무효화되었음을 나타내는 것이 아닙니다.


일반적으로 null 포인터 (void 포인터를 포함하여 모든 유형일 수 있음)는 다음을 가리 킵니다.

  • 대부분의 CPU 명령어 세트가 ISA를위한 최적의 코드 크기 / 성능으로 매우 빠른 비교 및 ​​분기 (예 : 초기화되지 않은 포인터 또는 유효하지 않은 포인터를 확인하기 위해)를 수행 할 수있는 주소 0.

  • 사용자 코드가 액세스 할 수없는 주소 (예 : 많은 경우 0x00000000). 따라서 코드가 실제로이 주소 또는 그 근처의 데이터에 액세스하려고하면 OS 또는 디버거가이 버그로 프로그램을 쉽게 중지하거나 트랩 할 수 있습니다.

void 포인터는 일반적으로 컴파일러 유형 검사를 속이거나 끄는 방법입니다. 예를 들어, 한 유형 또는 알 수없는 유형에 대한 포인터를 다른 유형으로 사용하려는 경우. 예를 들어 malloc ()은 타입이없는 메모리 청크에 대한 void 포인터를 반환합니다. 그 타입은 나중에 바이트, short int, double float, typePotato 등에 대한 포인터로 사용할 수 있습니다.


NULL모든 포인터 유형에 유효한 값입니다. 값이 없음을 나타냅니다.

void 포인터는 유형입니다. 모든 포인터 유형은 void 포인터로 변환 할 수 있으므로 모든 값을 가리킬 수 있습니다. 이것은 일반 보관에는 좋지만 사용에는 좋지 않습니다. 그 자체로는 값에 액세스하는 데 사용할 수 없습니다. 프로그램은 값에 액세스하기 전에 void 포인터가 참조하는 값의 유형을 이해하기위한 추가 컨텍스트를 가져야합니다.


널 포인터와 무효 포인터는 서로 완전히 다릅니다. 특정 데이터 유형에 대한 메모리를 할당하기 위해 운영 체제 (c langauge의 malloc ()를 통해)를 요청하면 운영 체제는 힙에 메모리를 할당하고 (힙에서 공간을 사용할 수있는 경우) 할당 된 메모리의 주소를 보냅니다.

메모리가 힙의 os에 의해 할당되면 해당 데이터 유형의 포인터 유형 변수에이 주소 값을 할당 할 수 있습니다. 이 포인터는 프로세스에 사용되지 않을 때까지 void 포인터라고합니다.

힙에서 공간을 사용할 수없는 경우 운영 체제는 확실히 메모리를 할당하고 해당 위치의 주소 값을 보내지 만 힙에 공간이 없기 때문에이 메모리는 OS에 의해 힙에 할당되지 않습니다. 시스템 메모리의 os ..이 메모리는 사용자가 액세스 할 수 없으므로 포인터에이 주소 값을 할당 할 때이 포인터는 널 포인터로 알려져 있으며이 포인터를 사용할 수 없습니다. void 포인터의 경우 모든 프로그래밍 언어의 모든 프로세스에 사용할 수 있습니다.


AnT의 대답 이 옳지 않다고 생각 합니다.

  1. NULL포인터 상수 일뿐 ptr = NULL입니다. 그렇지 않으면 어떻게 .
  2. NULL포인터와 마찬가지로 그 유형은 무엇입니까? 유형은 단지라고 생각합니다 (void *). 그렇지 않으면 int * ptr = NULL(user-defined type)* ptr = NULL. void유형은 실제로 범용 유형입니다.
  3. "C11 (ISO / IEC 9899 : 201x) §6.3.2.3 포인터 섹션 3"에서 인용 :

    값이 0 인 정수 상수 표현식 또는 void * 유형으로 캐스트 된 이러한 표현식을 널 포인터 상수라고합니다.

간단히 말해서 NULL포인터는 void 포인터 상수입니다.


Null 포인터의 값은 0입니다. void 포인터는 ANSI에서 도입 한 일반 포인터입니다. 일반 포인터는 모든 데이터 유형의 주소를 보유 할 수 있습니다.


voidnull포인터 모두 끝에 메모리 위치를 가리 킵니다.

null포인터가있는 장소 (메모리 세그먼트)을 가리키는 통상 메모리 영역의 0 번 어드레스. 읽기 / 쓰기 또는 역 참조를 위해 액세스하려고 할 때 기본 OS가 "예약 된"메모리 위치 (구현 세부 사항)를 처리하는 방법에 대한 거의 모든 것입니다. 예를 들어, 특정 메모리 위치는 "액세스 불가능"으로 표시 될 수 있으며 액세스 될 때 예상을 던집니다.

void포인터 어디 가리 잠재적으로 임의의 타입 (기본, 참조 형 및 나타낼 수 를 포함하여null ).

누군가가 멋지게 말했듯이 null포인터는 값을void* 나타내는 반면 이상의 유형을 나타냅니다 .

참고URL : https://stackoverflow.com/questions/3581585/whats-the-difference-between-a-null-pointer-and-a-void-pointer

반응형