programing

NULL 매크로가 0이 아닌 때는 언제입니까?

kingscode 2023. 6. 10. 16:07
반응형

NULL 매크로가 0이 아닌 때는 언제입니까?

저는 2년 전에 이것에 대해 읽은 것을 어렴풋이 기억하지만, 인터넷에서 어떤 언급도 찾을 수 없습니다.

NULL 매크로가 0으로 확장되지 않은 예를 보여주시겠습니까?

명확성을 위해 편집:오늘날 다음 중 하나로 확장됩니다.((void *)0),(0)또는(0L)그러나 오래 전에 이 사실이 아닌 곳에서 잊혀진 아키텍처가 있었고 NULL이 다른 주소로 확장되었습니다. 같은 것.

#ifdef UNIVAC
     #define NULL (0xffff)
#endif

저는 그런 기계의 예를 찾고 있습니다.

문제 해결을 위한 업데이트:

저는 이 질문을 현재의 기준의 맥락에서 의도한 것이 아니며, 저의 잘못된 용어로 사람들을 화나게 하려는 것이 아닙니다.하지만, 제 추측은 받아들여진 답변에 의해 확인되었습니다.

이후의 모델들은 잘못된 가정을 한 현존하는 부실하게 작성된 모든 C 코드에 대한 소프로 [blah]를 사용했습니다.

현재 표준의 null 포인터에 대한 자세한 내용은 질문을 참조하십시오.

C FAQ에는 NULL 표현이 0이 아닌 과거 시스템의 예가 몇 가지 있습니다.

C FAQ 목록에서 질문 5.17:

Q: 정말로, 실제로 0이 아닌 널 포인터를 사용한 실제 기계가 있습니까, 아니면 다른 유형의 포인터를 위한 다른 표현이 있습니까?

에 대해 널대해 , 했습니다.A: 프라임 50은 077777, Null은 0입니다. 적어도 PL/I에 대해서는.이후 모델은 C에서 널 포인터에 대해 세그먼트 0, 오프셋 0을 사용하여 TCNP(테스트 C 널 포인터)와 같은 새로운 지침이 필요했으며, 잘못된 가정을 한 기존의 모든 부실하게 작성된 C 코드에 대한 소프로 분명히 필요했습니다.오래된 주소의 더큰 바이트포인터를 하는 것으로 .char *가 단어 포인터s)보다 더 중요합니다.int *s.s

는 세 형식 포인터)이 , 그중 두 는 C됩니다: General 의 Eclipse MV의 입니다.char *그리고.void *그리고 다른 모든 것을 위한 단어 포인터.16비트 노바 라인에서 32비트 MV 라인이 진화하는 동안의 역사적 이유로, 워드 포인터와 바이트 포인터는 워드의 다른 위치에 오프셋, 간접 및 링 보호 비트를 가지고 있었습니다.일치하지 않는 포인터 형식을 함수에 전달하면 보호 오류가 발생했습니다.결국 MVC 컴파일러는 포인터 유형 불일치 오류가 있는 코드를 처리하기 위해 많은 호환성 옵션을 추가했습니다.

일부 Honeywell-Bull 메인프레임은 (내부) null 포인터에 대해 비트 패턴 06000을 사용합니다.

CDC Cyber 180 Series에는 링, 세그먼트 및 오프셋으로 구성된 48비트 포인터가 있습니다.대부분의 사용자(링 11)는 0xB000000000의 null 포인터를 가지고 있습니다.오래된 CDC 1개 보완 장치에서는 잘못된 주소를 포함한 모든 종류의 데이터에 대해 전체 1비트 단어를 특별한 플래그로 사용하는 것이 일반적이었습니다.

주소와 다른 지정 합니다. 로 "HP 3000"과 "HP 3000"에 대해 서로 합니다. 위의 여러 기계와 마찬가지로 다음에 대해 서로 다른 표현을 사용합니다.char *그리고.void *다른 포인터보다 포인터가 많습니다.

인 Symbolics Machine은 포인터조차 Symbolics Lisp Machine이라는 합니다.<NIL, 0>하지 않는 )<object, offset>핸들)을 C null 포인터로 지정합니다.

사용 중인 "메모리 모델"에 따라 8086 계열 프로세서(PC 호환)는 16비트 데이터 포인터와 32비트 함수 포인터를 사용하거나 그 반대일 수 있습니다.

은 부비 64트은 Craymachine을 나타냅니다.int *; 단의비하 48트위;char *또한 상위 16비트 중 일부를 사용하여 단어 내의 바이트 주소를 나타냅니다.

오래 전에 그것은 다음과 같이 타이핑되었습니다.((void*)0)또는 기계가 모두 제로 비트 패턴을 사용하지 않는 다른 기계 특정 방식.

일부 플랫폼(특정 CDC 또는 허니웰 머신)은 NULL(즉, 모든 0이 아님)에 대해 다른 비트 패턴을 가지고 있었지만, ISO/ANSI는 C90이 비준되기 전에 다음과 같이 지정하여 이를 수정했습니다.0기본 비트 패턴에 관계없이 소스 코드의 올바른 NULL 포인터입니다.부터C11 6.3.2.3 Pointers /4, 이까지 거슬러 올라갑니다 서언바급같와이한까지이, 문올거다는라 C90러니갑슬앞구에)▁(다90)

이 값 는 수 상 식 정 수인 0또는 타자기에 주조된 그런 표현.void *를 null 포인터 상수라고 합니다.

에서는 'C 일러로는 '로할 수 .((void *)0)(그러나 그렇게 할 필요는 없습니다.)이것은 C++ 컴파일러에서는 작동하지 않습니다.

포인터에 대한 전체 장이 있는 C FAQ도 참조하십시오.

GNU libio.h 파일에서:

#ifndef NULL
# if defined __GNUG__ && \
(__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
#  define NULL (__null)
# else
#  if !defined(__cplusplus)
#   define NULL ((void*)0)
#  else
#   define NULL (0)
#  endif
# endif
#endif

__cplus에서 조건부 컴파일을 확인합니다.포인터 캐스팅에 대한 규칙이 엄격하기 때문에 C++에서는 (void*) 0을 사용할 수 없습니다. 표준에서는 NULL을 0으로 지정해야 합니다. C에서는 다른 NULL 정의를 허용합니다.

C 컴파일러는 일반적으로 다음을 사용합니다.((void *)0)그 이유는 지나가기 때문입니다.NULL변수 인수가 있는 함수(또는 현재는 드물지만 프로토타입이 없는 합법적인 함수)입니다.보다 클 때, 포터보가 int클다때인클,,0로만 승격됩니다.int포인터로 올바르게 판독되지 않습니다.

는 C++에서에 해당 수 . C++는 다음에서 암시적 캐스트를 허용하지 않습니다.void *)0모든 포인터에 대해 특수한 경우가 있습니다. C 키워드를 했습니다.nullptr은 특수 의 널 입니다.nullptr_ttype은 임의의 포인터 형식으로 암시적으로 변환할 수 있지만 숫자는 아닙니다. 변수 인 캐스트 , 과부하선택 됩니다.0로 선한명한이유로백택을 합니다.int포인터 1)을 오버로드합니다.이전 컴파일러에 대해 직접 정의하는 것은 합법적이며 일부 C++ 컴파일러는 과거에 이를 시도했습니다.

의 C, 대현에 C서,에서,void *pointer = 0;아무 것도 가리키지 않도록 "표시"를 초기화합니다.이것은 "포인트"의 비트를 모두 0으로 설정함으로써 달성되는지 여부에 대한 플랫폼별입니다.

과거에는 포인터 컨텍스트에서 "0"의 공식적인 의미가 설정되지 않았습니다.포인터를 플랫폼이 "아무 곳도 가리키지 않음"으로 처리한 실제 값으로 설정해야 했습니다.예를 들어, 플랫폼은 페이지를 매핑하지 않는 고정 주소를 선택할 수 있습니다.이 경우, 오래된 컴파일러에서 플랫폼은 다음을 정의했을 수 있습니다.NULL다음과 같이:

#define NULL ((void*)0xFFFFF000)

물론, 오늘날, 그것을 정의하지 않을 이유는 없습니다.((void*)0).

NULLC의 매크로는 구현 정의된 null-point 상수로 확장됩니다. 수 구 정 므 로 모 것 될 수 있 포 만 지 인 터 컨 같 다 니 습 것 과 확 상 된 장 로 수 항 현 상 효 과 는 서 텍 에 트 스 의 이 든 이 ▁constant ▁to ▁is ▁it ▁effect ▁it ▁the ▁context ▁as ▁the ▁( ▁same ▁if ▁but ▁always 같 ▁it ▁in 다 니 ▁be 습 ▁pointer ation 0.

표준 C 역사에서 다음과 같은 시기는 없었습니다.NULL특별히 그렇지 않은 것으로 확장되었습니다.0하지 한(void *) 0"0이 아님"으로 표시합니다.그렇지만(void *) 0위해서NULL오늘날까지도 널리 사용되고 있습니다.

언급URL : https://stackoverflow.com/questions/2597142/when-was-the-null-macro-not-0

반응형