C에서 NULL은 0이어야 하는가?
내 GCC 테스트 프로그램에서 NULL은 0으로 보이지만, 위키피디아는NULL
주소를 알 수 없는 메모리만 가리키면 된다.
컴파일러가 만드는 모든 것을 한다.NULL
0이 아닌?나는 궁금하다if (ptr == NULL)
보다 더 나은 연습이다if (!ptr)
.
NULL
0으로 보장되며, 아마도 에 캐스팅될 것이다.(void *)
1.
C99, §6.3.2.3, 3
값이 있는 정수 상수 식
0
, 또는 그러한 표현으로 타이핑을 한다.void *
을 null 포인터 상수라고 한다.(55) null 포인터 상수를 포인터 유형으로 변환하면 null 포인터라고 하는 결과 포인터가 어떤 물체나 함수에 대한 포인터와 동일하지 않은 비교를 보장한다.
그리고 노트 55는 다음과 같이 말한다.
55) 매크로 NULL은 다음과 같이 정의된다.
<stddef.h>
(및 기타 헤더)를 null 포인터 상수로 사용한다.
null 포인터에 대한 규칙을 공식화하는 방법 때문에 null 포인터를 할당/계산하는 데 사용하는 값은 0으로 보장되지만, 포인터 내부에 실제로 저장된 비트 패턴은 다른 것일 수 있다는 점에 유의하십시오(그러나 AFAIK는 이 사실을 악용한 극소수의 난해한 플랫폼만 사용할 뿐이며, 어쨌든 "보기" 때문에 문제가 되지 않아야 함).어쨌든 UB-land로 들어가야 하는 기본 비트 패턴).
그래서 표준에 관한 한, 두 형태는 등가(등가)이다.!ptr
와 같다ptr==0
제6.5.3.3조 5항 기인ptr==0
와 같다ptr==NULL
);if(!ptr)
또한 꽤 관용적이다.
말하자면, 나는 보통 명시적으로 글을 쓴다.if(ptr==NULL)
대신에if(!ptr)
부울 값 대신 포인터가 무효인지 확인하는 거야
- C++의 경우
void *
그러한 것을 사용하도록 하는 보다 엄격한 암묵적인 캐스팅 규칙 때문에 캐스팅이 존재할 수 없다.NULL
(매번 비교 포인터 유형으로 명시적으로 변환해야 한다.)
언어 표준:
6.3.2.3 포인터
...
3 값이 0인 정수 상수식 또는 형식에 캐스트된 식void *
을 null 포인터 상수라고 한다.55)null 포인터 상수가 포인터 유형으로 변환된 경우 null 포인터라고 하는 결과 포인터에는 어떤 개체나 기능에 대한 포인터와 동일하지 않은 비교가 보장된다.
...
55) 매크로NULL
에 정의되어 있음<stddef.h>
(및 기타 헤더)를 null 포인터 상수로 사용한다. 7.17을 참조하십시오.
해당 언어를 고려할 때 매크로 NULL은 0 값 식(미사양 리터럴)으로 평가해야 한다.0
, , 은과 (void *) 0
, 또는 궁극적으로 0으로 평가되는 또 다른 매크로 또는 표현식).그 표현들은ptr == NULL
그리고!ptr
등가여야 한다.두 번째 형태는 더 관용적인 C 코드인 경향이 있다.
null 포인터 값은 0일 필요는 없다는 점에 유의하십시오.기본 구현에서는 null 포인터를 나타내기를 원하는 값을 사용할 수 있다.그러나 소스 코드에 관한 한, 0 값 포인터 식은 null 포인터를 나타낸다.
실제는 같지만 NULL은 0과 다르다.0은 값이 있다는 뜻이고 NULL은 값이 없다는 뜻이기 때문이다.따라서 이론적으로 NULL은 다른 의미를 가지며 어떤 경우에는 그 차이가 어느 정도 유용해야 한다.
연습 no, !ptr은 정확하다.
참조URL: https://stackoverflow.com/questions/8288482/is-null-in-c-required-defined-to-be-zero
'Programing' 카테고리의 다른 글
Java에서 돈으로 사용할 데이터 유형을 선택하십시오. (0) | 2022.04.23 |
---|---|
Java에서 System variable 값을 얻는 방법은? (0) | 2022.04.23 |
부모 구성 요소에서 자식 구성 요소의 메서드를 호출하려면 어떻게 해야 하는가? (0) | 2022.04.23 |
Vue의 런타임 전용 빌드는 정확히 무엇이며 컴파일러 빌드와 어떻게 다른가? (0) | 2022.04.23 |
Vue-tables-2(vuex) 반응성이 작동하지 않음 (0) | 2022.04.23 |