야외 지침에 대한 이해를 이야기하다
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=#
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.