"NULL 포인터의 참조 해제"는 정확히 무엇을 의미합니까?
저는 C의 초보자이며, 대학 연구 중에 종종 NULL 포인터의 참조 해제와 관련된 코드의 코멘트를 접했습니다.저는 C#에 대한 경험이 있습니다.이것이, 에 있는 「NullReferenceException」과 비슷할 가능성이 있다고 생각하고 있습니다.네, 하지만 지금 나는 심각한 의심을 하고 있어요.
이게 정확히 무엇이고 왜 나쁜 것인지 누가 나에게 설명해 줄 수 있나요?
A NULL
포인터는 존재하지 않는 메모리를 가리킵니다.주소일 수 있습니다.0x00000000
또는 다른 구현 정의 값(실제 주소가 될 수 없는 한)을 지정합니다.역참조란 포인터가 가리키는 모든 것에 접근하려는 것을 의미합니다.그*
operator는 비회의 연산자입니다.
int a, b, c; // some integers
int *pi; // a pointer to an integer
a = 5;
pi = &a; // pi points to a
b = *pi; // b is now 5
pi = NULL;
c = *pi; // this is a NULL pointer dereference
이것은 정확히 같은 것이다.NullReferenceException
단, C의 포인터는 어떤 데이터 객체(배열 내의 요소도 포함)를 가리킬 수 있습니다.
역참조란 특정 주소의 메모리 값에 액세스하는 것을 의미합니다.포인터가 있는 경우 포인터를 참조 해제하는 것은 포인터가 가리키는 데이터를 읽거나 쓰는 것을 의미합니다.
C에서 단항은*
operator는 비회의 연산자입니다.한다면x
그럼 포인터입니다.*x
무엇이냐x
가리키고 있습니다.단항&
operator는 연산자의 주소입니다.한다면x
그럼 뭐든 되는 거네요&x
의 주소입니다.x
메모리에 저장됩니다.그*
그리고.&
연산자는 서로 반대입니다.x
모든 데이터입니다.y
는 임의의 포인터이며, 다음 방정식은 항상 참입니다.
*(&x) == x
&(*y) == y
늘 포인터는 유효한 데이터를 가리키지 않는 포인터입니다(단, 유일한 포인터는 아닙니다).C 표준에서는 늘 포인터를 참조 해제하는 것은 정의되지 않은 동작이라고 합니다.즉, 프로그램이 크래쉬 하거나, 계속 사일런트하게 동작하거나, 하드 드라이브를 소거하거나 하는 등, 어떠한 일도 일어날 가능성이 있습니다.
대부분의 구현에서는 "세그멘테이션 장애" 또는 "액세스 위반"이 발생하며, 이는 거의 항상 운영체제에 의해 프로그램이 종료됩니다.다음은 null 포인터를 참조할 수 있는 한 가지 방법입니다.
int *x = NULL; // x is a null pointer
int y = *x; // CRASH: dereference x, trying to read it
*x = 0; // CRASH: dereference x, trying to write it
늘 ''와 .NullReferenceException
C#('a'))에서NullPointerException
랑가우게(Langauge)늘되어 있습니다.즉, C#을 .NullReferenceException
C에서처럼 프로그램이 계속 사일런트하게 작동하거나 하드 드라이브를 지울 수 있는 방법은 없습니다(언어 런타임에 버그가 발생하지 않는 한, 그것도 매우 가능성이 낮습니다).
NULL 포인터는 존재하지 않는 메모리를 가리키며 분할 장애를 발생시킵니다.NULL 포인터를 참조 해제하는 더 쉬운 방법이 있습니다. 한 번 보세요.
int main(int argc, char const *argv[])
{
*(int *)0 = 0; // Segmentation fault (core dumped)
return 0;
}
0은 유효한 포인터 값이 아니므로 장애가 발생합니다.
SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL}
위키피디아 인용:
포인터는 메모리 내의 위치를 참조하며 포인터가 참조하는 위치의 값을 얻는 것은 포인터의 참조 해제라고 알려져 있습니다.
란, 「역참조하다」를 .unary *
포인터의 연산자.
int x = 5;
int * p; // pointer declaration
p = &x; // pointer assignment
*p = 7; // pointer dereferencing, example 1
int y = *p; // pointer dereferencing, example 2
"a pointer는 "NULL"을 실행하는 것을 *p
그 p
NULL
값이 값)., 0, 「」, 「0」, 「0」, 「0」, 「0」, 「0」을 .
늘 값 포인터는 의미 있는 오브젝트를 참조하지 않기 때문에 늘 포인터를 참조 해제하려고 하면 런타임에러가 발생합니다.
int val =1;
int *p = NULL;
*p = val; // Whooosh!!!!
즉,
myclass *p = NULL;
*p = ...; // illegal: dereferencing NULL pointer
... = *p; // illegal: dereferencing NULL pointer
p->meth(); // illegal: equivalent to (*p).meth(), which is dereferencing NULL pointer
myclass *p = /* some legal, non-NULL pointer */;
*p = ...; // Ok
... = *p; // Ok
p->meth(); // Ok, if myclass::meth() exists
기본적으로, 거의 모든 것이(*p)
암묵적으로 관련되다(*p)
예 , ) 。p->...
입니다.(*p). ...
; (일본어)
언급URL : https://stackoverflow.com/questions/4007268/what-exactly-is-meant-by-de-referencing-a-null-pointer
'source' 카테고리의 다른 글
CPU는 이 TensorFlow 바이너리를 사용하기 위해 컴파일되지 않은 명령을 지원합니다.AVX AVX2 (0) | 2023.01.22 |
---|---|
Conda 환경 삭제 (0) | 2023.01.22 |
v-model을 사용한 Vuex 입력이 반응하지 않음 (0) | 2023.01.22 |
자바에서의 부울에 대한 비트 연산자의 영향 (0) | 2023.01.22 |
jQuery를 사용하여 키 누르기 이벤트를 트리거하는 결정적인 방법 (0) | 2023.01.22 |