programing

NULL, '\0'과 0의 차이점은 무엇입니까?

bestcode 2022. 8. 10. 22:30
반응형

NULL, '\0'과 0의 차이점은 무엇입니까?

0의 한 값 가 있는 것으로 . - C 서 0 양 0 양 양 0 양 in 0 。NULL,NUL ★★★★★★★★★★★★★★★★★」0.

는 ASCII 자 i i i 。'0'48 ★★★★★★★★★★★★★★★★★」0x30.

NULL포인터는 보통 다음과 같이 정의됩니다.

#define NULL 0

또는

#define NULL (void *)0

,, 음, 음, 음, 다, 다 등이 있습니다.NUL ★★★'\0'될 것 .0뿐만 아니라.

이 세 가지 값이 같을 수 없는 경우가 있습니까?

64비트 시스템에서도 마찬가지입니까?

주의: 이 답변은 C++가 아닌 C 언어에 적용됩니다.


특수한 포인터

리터럴 " " " "0사용하는 문맥에 따라 다른 의미를 달리합니다.모든 경우 이 값은 다음과 같은 정수 정수입니다.0 '','다르다', '다르다', '다르다', '다르다', '다르다', '다르다', '다르다', '다르다', '다르다', '다르다', '다르다', '다르다', '다르다', '다르다 '다르다

리터럴과 되는 0이치노 ★★★★★★★★★★★★★★★★★.0는 늘 포인터 상수라고 불립니다.은 C를 C로 정의하고 .0void *는 늘 포인터이자 늘 포인터 상수입니다.

을 높이기 , 「」를 합니다.NULL는 헤더 .stddef.h하시는 컴파일러에 , 「」를 사용할 수 #undef NULL이상한 걸로 재정의하는 거야

따라서 늘 포인터를 체크하는 유효한 방법은 다음과 같습니다.

if (pointer == NULL)

NULL는 늘 포인터와 비교하도록 정의되어 있습니다.되어 있는 것은 입니다.NULL유효한 늘 포인터 상수이면 됩니다.

if (pointer == 0)

0는 늘 포인터 상수의 다른 표현입니다.

if (!pointer)

★★★★★★★★★★★★★★★★★.if스테이트먼트는 암묵적으로 「is not 0」을 체크하기 때문에, 「is 0」의 의미로 되돌립니다.

다음은 늘 포인터를 확인하는 잘못된 방법입니다.

int mynull = 0;
<some code>
if (pointer == mynull)

컴파일러에게 이것은 늘 포인터의 검사가 아니라 두 변수에 대한 동등성 검사입니다.이것은 mynull이 코드로 변경되지 않고 컴파일러 최적화가 0을 if 스테이트먼트로 계속 접는 경우 동작할 수 있지만, 이것은 보증되지 않으며 컴파일러는 C Standard에 따라 적어도1개의 진단 메시지(경고 또는 오류)를 생성해야 합니다.

기본 아키텍처에서는 C 언어의 늘포인터 값은 중요하지 않습니다.기본 아키텍처에 주소 0xDEADBEEF로 정의된 늘 포인터 값이 있는 경우 이 문제를 해결하는 것은 컴파일러에 달려 있습니다.

따라서 이 재미있는 아키텍처에서도 늘 포인터를 체크하는 방법은 다음과 같습니다.

if (!pointer)
if (pointer == NULL)
if (pointer == 0)

다음은 늘 포인터를 확인하는 잘못된 방법입니다.

#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)

컴파일러에 의해 정상적인 비교로 인식되기 때문입니다.

특수한 문자

'\0'는 늘 문자로 정의됩니다.즉, 모든 비트가 0으로 설정된 문자입니다. '\0'는 (모든 문자 리터럴과 마찬가지로) 정수입니다.이 경우 값은 0입니다. ★★★★★★★★★★★★★★★★★.'\0'는 꾸미지 않은 것과 완전히 합니다.0정수 상수 - 유일한 차이는 인간 판독기에 전달하는 의도("이 문자를 늘 문자로 사용합니다.")입니다.

'\0'이치노 것이 수 . '있다', '있다' 입니다.

if (!*char_pointer)

는 문자 포인터가 늘 문자를 가리키고 있는지 여부를 확인합니다.

if (*char_pointer)

는 문자 포인터가 문자 이외의 문자를 가리키고 있는지 여부를 확인합니다.

이것들을 널 포인터와 혼동하지 마라.비트 표현이 동일하고, 이것에 의해 편리한 크로스 오버 케이스가 가능하게 된다고 해서, 실제로는 같은 것이 아닙니다.

레퍼런스

자세한 내용은 comp.lang.c FAQ 5.3을 참조하십시오.C 표준에 대해서는, 이 PDF참조해 주세요.섹션 6.3.2.3 포인터, 단락 3을 확인합니다.

많은 사람들이 NULL, \0, 0의 차이를 잘못 알고 있는 것 같습니다.앞서 말한 것을 반복하지 않기 위해 설명하겠습니다.

int0 0으로 합니다.void *는 늘 포인터 상수이며 포인터로 변환되면 늘 포인터가 됩니다.표준에서는 어떤 객체나 함수에 대한 포인터와도 동등하지 않음을 보증합니다.

NULL는 매크로로, 에서 늘 포인터 상수로 정의됩니다.

\0는 늘 문자를 나타내기 위해 사용되는 구성이며 문자열을 끝내기 위해 사용됩니다.

문자는 모든 비트가 0으로 설정된 바이트입니다.

세 가지 모두 다른 맥락에서 0의 의미를 정의합니다.

  • 포인터 컨텍스트 - NULL이 사용되며 포인터 값은 32비트 또는 64비트(경우에 따라 4바이트, 0의 나머지 8바이트)에 관계없이 0임을 의미합니다.
  • string context - 숫자0을 나타내는 문자의 16진수 값은 0x30이지만 NUL 문자의 16진수 값은 0x00(문자열 종단용으로 사용)입니다.

메모리를 보면, 다음의 3개는 항상 다릅니다.

NULL - 0x00000000 or 0x00000000'00000000 (32 vs 64 bit)
NUL - 0x00 or 0x0000 (ascii vs 2byte unicode)
'0' - 0x20

이것으로 명확해졌으면 좋겠다.

NULL과 0이 NULL 포인터 상수와 동일한 경우 C FAQ 목록에서 다음 문제를 해결해야 합니다.

C 프로그래머는 이 점을 이해해 둘 필요가 있다.NULL그리고.0포인터 컨텍스트에서 교환이 가능하며, 비캐스팅은0완벽하게 받아들일 수 있습니다.NULL의 임의의 사용(대상이 아님)0)는 포인터가 관여하고 있다는 것을 부드럽게 상기시켜 주는 것으로 간주됩니다.프로그래머는 포인터를 식별하기 위해 포인터에 의존해서는 안 됩니다(자신의 이해나 컴파일러의 이해 중 하나).0정수로부터의 s0

는 포인터 컨텍스트에서만 가능합니다.NULL그리고.0동등합니다. NULL다른 종류의 경우 사용해서는 안 된다0동작할 수도 있지만 필요한 것은 잘못된 스타일 메시지를 보내기 때문입니다.(더욱 ANSI를 사용하면,NULL되려고((void *)0)는, 비패키지 콘텍스트에서는 전혀 동작하지 않습니다).특히 사용하지 마십시오.NULLASCII 늘 문자(NUL)가 바람직합니다.독자적인 정의를 제공하다

#define NUL '\0'

당신이 그래야만 한다면.

NULL, '\0'과 0의 차이점은 무엇입니까?

"null character(NUL)"는 제외하기 가장 쉽습니다. '\0'는 문자 그대로입니다.C에서는 다음과 같이 구현됩니다.int즉, 0과 같습니다. 즉,INT_TYPE_SIZEC++ 에서는, 문자 리터럴은 다음과 같이 실장됩니다.char(즉, 1바이트).이것은 보통 와는 다릅니다.NULL또는0.

다음 분.NULL는 변수가 주소 공간을 가리키지 않도록 지정하는 포인터 값입니다.통상적으로 제로로서 실장되는 것은 차치하고, 아키텍처의 완전한 주소 공간을 표현할 수 있어야 합니다.따라서 32비트 아키텍처에서는 NULL(아마도)은 4바이트, 64비트 아키텍처에서는 8바이트입니다.이것은 C의 실장에 달려 있습니다.

마지막으로 리터럴은0종류int, 사이즈는INT_TYPE_SIZE의 디폴트값INT_TYPE_SIZE아키텍처에 따라 다를 수 있습니다.

Apple은 다음과 같이 쓰고 있습니다.

Mac OS X에서 사용되는 64비트 데이터 모델은 "LP64"로 알려져 있습니다.이는 64비트 Linux뿐만 아니라 Sun 및 SGI의 다른 64비트 UNIX 시스템에서 사용되는 공통 데이터 모델입니다.LP64 데이터 모델은 다음과 같이 원시 유형을 정의합니다.

  • ints는 32비트입니다.
  • longs는 64비트입니다.
  • long-longs도 64비트입니다.
  • 포인터는 64비트입니다.

Wikipedia 64비트:

Microsoft의 VC++ 컴파일러는 LLP64 모델을 사용합니다.

64-bit data models
Data model short int long  long long pointers Sample operating systems
LLP64      16    32  32    64        64       Microsoft Win64 (X64/IA64)
LP64       16    32  64    64        64       Most Unix and Unix-like systems (Solaris, Linux, etc.)
ILP64      16    64  64    64        64       HAL
SILP64     64    64  64    64        64       ?

편집: 문자 리터럴에 추가.

#include <stdio.h>

int main(void) {
    printf("%d", sizeof('\0'));
    return 0;
}

위의 코드는 gcc에서 4, g++에서 1을 반환합니다.

값이 0인 바이트0x00ASCII 테이블에서는, 라고 하는 특수 문자입니다.NUL또는NULLC에서는 제어문자를 소스 코드에 포함시키면 안 되기 때문에 이 문자는 이스케이프된0 의 C 문자열로 표시됩니다.\0.

그러나 진정한 NULL은 값이 아닙니다.그것은 가치의 부재이다.포인터의 경우 포인터가 가리키는 것이 없음을 의미합니다.데이터베이스에서는 필드에 값이 없음을 의미합니다(필드가 공백, 0 또는 공백으로 채워져 있는 것과 동일하지 않습니다).

특정 시스템 또는 데이터베이스 파일 형식이 다음을 나타내기 위해 사용하는 실제 값NULL반드시 그렇지는 않다0x00.

C로 시작할 때 도움이 되는 좋은 점 하나(Linden의 Expert C 프로그래밍에서 인용)

1 'l' nul과 2 'l' null

포인터와 ASCII 0에 대한 올바른 용어를 불러오려면 이 작은 운을 기억하십시오.

The one "l" NUL ends an ASCII string,

The two "l" NULL points to no thing.

Apologies to Ogden Nash, but the three "l" nulll means check your spelling. 
  • 비트 패턴이 0인 ASCII 문자를 "NUL"이라고 합니다.
  • 포인터가 아무 곳에도 표시되지 않음을 의미하는 특수 포인터 값은 "NULL"입니다.
  • 그 두 용어의 의미는 서로 바꿀 수 없다.

'NUL'은 0이 아니라 ASCII NUL 문자를 나타냅니다.적어도, 나는 그렇게 그것을 사용해 왔다.늘 포인터는 종종 0으로 정의되지만 이는 실행 중인 환경과 사용 중인 운영 체제 또는 언어의 사양에 따라 달라집니다.

ANSI C에서는 늘 포인터는 정수값 0으로 지정됩니다.그렇지 않은 세계는 ANSI C에 준거하지 않습니다.

1L NUL이면 문자열이 끝납니다.

2L NULL은 아무것도 가리키지 않습니다.

그리고 나는 황금 황소를 걸 것이다.

3L NULL은 존재하지 않습니다.

NUL은 어떻게 대처합니까?

NULL이 값은 아키텍처에 따라 다릅니다.대부분의 주요 아키텍처는 다음을 정의합니다.(void*)0.

'\0'문자 리터럴에서는 바이트0 이 부호화되기 때문에 항상0 이 됩니다.

C 컴파일러가 ASCII를 사용해야 하는지 기억나지 않습니다.그렇지 않다면'0'항상 48은 아닐 수 있습니다.그럼에도 불구하고, 매우 불분명한 시스템에서 작업하지 않는 한 EBCDIC과 같은 대체 문자 집합을 사용하는 시스템을 접하지 못할 것입니다.

64비트 시스템에서는 다양한 유형의 크기가 다르지만 정수 값은 동일합니다.


일부 코멘트는 NULL이 0이 아니라 0이라는 점에 의문을 제기하고 있습니다.다음은 이러한 시스템에서 예상되는 출력과 함께 프로그램 예입니다.

#include <stdio.h>

int main () {
    size_t ii;
    int *ptr = NULL;
    unsigned long *null_value = (unsigned long *)&ptr;
    if (NULL == 0) {
        printf ("NULL == 0\n"); }
    printf ("NULL = 0x");
    for (ii = 0; ii < sizeof (ptr); ii++) {
        printf ("%02X", null_value[ii]); }
    printf ("\n");
    return 0;
}

이 프로그램은 다음을 인쇄할 수 있습니다.

NULL == 0
NULL = 0x00000001

(void*) 0은 NULL이며, '\0'은 문자열의 끝을 나타냅니다.

언급URL : https://stackoverflow.com/questions/1296843/what-is-the-difference-between-null-0-and-0

반응형