댕글링 포인터
댕글링 포인터는 해제(또는 삭제)된 메모리 위치를 가리키는 포인터입니다. 포인터가 매달린 포인터 역할을 하는 여러 가지 방법이 있습니다.
함수 호출
로컬 변수를 가리키는 포인터는 로컬 변수가 정적이지 않을 때 댕글링됩니다.
int *show(void) { int n = 76; /* ... */ return &n; }
출력
Output of this program will be garbage address.
메모리 할당 해제
#include <stdlib.h> #include <stdio.h> int main() { float *p = (float *)malloc(sizeof(float)); //dynamic memory allocation. free(p); //after calling free() p becomes a dangling pointer p = NULL; //now p no more a dangling pointer. }
변수가 범위를 벗어남
int main() { int *p //some code// { int c; p=&c; } //some code// //p is dangling pointer here. }
무효 포인터
C의 void 포인터는 어떤 데이터 유형과도 연결되지 않은 포인터입니다. 저장소의 일부 데이터 위치를 가리키는 것은 변수의 주소를 가리키는 것을 의미합니다. 범용 포인터라고도 합니다.
몇 가지 제한 사항이 있습니다.
void 포인터의 구체적인 크기 때문에 포인터 연산이 불가능합니다.
역참조로 사용할 수 없습니다.
다음은 간단한 예입니다.
#include<stdlib.h> int main() { int a = 7; float b = 7.6; void *p; p = &a; printf("Integer variable is = %d", *( (int*) p) ); p = &b; printf("\nFloat variable is = %f", *( (float*) p) ); return 0; }
출력
Integer variable is = 7 Float variable is = 7.600000
알고리즘
Begin Initialize a variable a with integer value and variable b with float value. Declare a void pointer p. (int*)p = type casting of void. p = &b mean void pointer p is now float. (float*)p = type casting of void. Print the value. End.
널 포인터
널 포인터는 아무 것도 가리키지 않는 포인터입니다. 널 포인터의 일부 용도는 다음과 같습니다.
포인터 변수에 유효한 메모리 주소가 아직 할당되지 않은 경우 포인터 변수를 초기화하려면
유효한 메모리 주소를 전달하지 않으려면 함수 인수에 널 포인터를 전달합니다.
포인터 변수에 액세스하기 전에 null 포인터를 확인합니다. 따라서 포인터 관련 코드에서 오류 처리를 수행할 수 있습니다. NULL이 아닌 경우에만 포인터 변수를 역참조합니다.
예시
#include<iostream> #include <stdio.h> int main() { int *p= NULL;//initialize the pointer as null. printf("The value of pointer is %u",p); return 0; }
출력
The value of pointer is 0.
와일드 포인터
와일드 포인터는 임의의 메모리 위치를 가리키는 포인터입니다. (NULL도 아님)
int main() { int *ptr; //wild pointer *ptr = 5; }