야외 지침에 대한 이해를 이야기하다

1656 단어
야지침은 명확하지 않거나 무의미한 지침을 가리키는 것으로 야지침의 발생은 다음과 같은 세 가지 탓으로 돌린다.먼저 빈 포인터 (null pointer) 를 말하십시오. 빈 포인터는 어떤 대상이나 함수를 가리키지 않으며, 반대로 어떤 대상이나 함수의 주소도 빈 포인터가 될 수 없습니다.빈 포인터는 어떻게 만듭니까?
int * pt=NULL;
빈 포인터 NULL과 메모리 기본 주소 0x0의 차이점은?빈 포인터는 대상을 가리키지 않습니다. 포인터 값은 0x0이지만, 포인터에 대한 인용 해제 *pt는 실제 메모리를 가리키지 않기 때문에 의미가 없습니다.메모리 0 주소의 주소 값도 0x0이지만 메모리 0 주소의 인용을 해제하는 것은 의미가 있습니다.
상황1: 바늘을 정의했지만 초기화되지 않았습니다. 이 때 바늘의 지향이 명확하지 않습니다.
// pi pd , 
int * pi;
double * pd;
상황2: 우리는 때때로 동적 메모리 분배 (new 또는malloc) 를 통해 메모리 블록을 분배하고 해당하는 바늘이 메모리 블록을 가리키는 것을 정의해야 한다.프로그램이 끝날 때 (free 또는 delete) 를 통해 메모리를 회수해야 합니다.아래와 같이 64bytes 두 단락의 메모리를 분배하였으며 pt1과 pt2가 가리키고 있다.
// 
int * pt1=(int *)malloc(16*sizeof(int));
int * pt2=new int [16];

// 
printf("%p %p 
",pt1,pt2); printf("%d %d
",*pt1,*pt2); // free(pt1); delete pt2; // printf("%p %p
",pt1,pt2); printf("%d %d
",*pt1,*pt2); // // pt1 pt2 pt1=pt2=NULL;
동적 메모리로 분배된 두 단락의 메모리를 회수한 후에 프로그램은 포인터 pt1과 pt2를 통해 메모리의 데이터에 접근할 수 없지만 포인터는 이 메모리 블록을 가리킨다. 즉, 포인터의 값은 변하지 않는다. 이때 포인터 pt1과 pt2는 야생 포인터가 된다.야생 포인터의 발생을 막고 불법 접근을 피하기 위해 야생 포인터를 빈 포인터(NULL)로 바꿀 수 있다.
상황3: 포인터의 저장 주기가 포인터가 가리키는 변수의 저장 주기보다 크면 변수의 작용역이 끝난 후에 대응하는 포인터는 야생 포인터가 된다.다음 코드는 for 순환은 하나의 코드 구간에 속하고num의 작용역은 for 순환체이며 순환이 끝난 후에num의 메모리는 회수되고num 변수는 존재하지 않습니다.포인터 pt는 for 순환을 제외하고 있기 때문에 작용역은 포인터 순환에 국한되지 않습니다. 따라서 순환이 끝난 후에도 PT는 여전히 존재하고 원래num이 있는 메모리의 위치를 가리키지만 이 메모리는 이미 회수되었기 때문에 의미가 없고 PT는 야외 포인터가 됩니다.
// pt , 
int * pt=NULL;
for(int i=0;i<10;i++)
{
    int num;
    num=i;
    pt=&num;
}

좋은 웹페이지 즐겨찾기