[C 언어] 야생 지침이 발생하는 원인, 위해와 회피 방법

1. 야생 지침이 생기는 원인:
1. 포인터 변수를 정의하는 동시에 초기화하지 않았습니다. 포인터가 정의되었을 때 프로그램이 초기화하지 않으면 무작위 영역을 가리킵니다. 포인터 변수(static 수식된 포인터 변수 제외)는 정의될 때 비어있지 않고 기본값은 무작위이기 때문입니다.
2. 바늘이 가리키는 메모리 공간이 방출되었을 때 이 바늘 변수의 값(즉 이 바늘이 가리키는 메모리 공간의 주소)을 비우지 않았다. 우리는 라이브러리 함수인malloc로 메모리 공간을 개척할 때 반환 값이 비었는지 확인하고 비었으면 개척에 실패했다.비어 있지 않으면, 바늘은 열린 메모리 공간의 첫 번째 주소를 가리킨다.바늘이 가리키는 메모리 공간은free()나 delete(delete는 하나의 조작부호일 뿐이고free()는 함수)로 방출된 후 프로그래머가 빈 값이나 다른 값을 부여하지 않으면 야생 바늘이 된다.
3. 바늘 조작은 변수 작용역을 초월한다. 창고 메모리를 가리키는 바늘이나 인용을 되돌려주지 마라. 창고 메모리는 함수가 끝날 때 방출되기 때문이다.예를 들어 국부 변수와 국부 그룹의 주소를 되돌려주지 않습니다.
2. 야생 지침의 위해:
야생 바늘의 문제는 바늘이 가리키는 메모리 공간이 이미 무효라는 것이다. 이 바늘 변수의 값(즉 이 바늘이 원래 가리키는 메모리 공간의 주소)이 비어 있지 않다는 것이다. 비어 있지 않은 무효 바늘을 인용하는 것은 정의되지 않은 행위이다. 즉, 정해지지 않은 단락 오류를 초래하고 야생 바늘이 어디에 문제가 생겼는지, 어디에 있으면 이 바늘이 효력을 잃어 오류의 원인을 찾기 어렵다는 것이다.그래서 디버깅하기가 귀찮을 수도 있고, 때로는 시간이 오래 걸릴 수도 있다.
3. 야외 지침을 피하는 방법:
1. 포인터를 정의할 때 동시에 NULL로 초기화한다.예:
int *p=NULL

2. 포인터가 가리키는 메모리 공간을 놓을 때 포인터를 NULL로 재설정합니다.(코드를 작성할 때free() 함수를 봉인하고free()를 호출한 후 바늘을 NULL로 설정하는 것이 좋습니다.)예:
free(p1);			//    p1               p1   
p1 = NULL;

프로그램 인스턴스 프레젠테이션:
오류 예:
#include 
#include 
 
int main()
{
	char *p1 = NULL;
	printf("p1:%d, &p1:%d
"
,p1,&p1); p1 = (char*)malloc(50); // p1 printf("p1:%d, &p1:%d
"
,p1,&p1); if(p1 == NULL) // return { return; } if(p1 != NULL) // : p1 { free(p1); // p1 p1 printf("p1:%d, &p1:%d
"
,p1,&p1); } system("pause"); return 0; }

실행 결과:
p1:0, &p1:6487576
p1:7803872, &p1:6487576
p1:7803872, &p1:6487576
       . . .

수정 후:
#include 
#include 
 
int main()
{
	char *p1 = NULL;
	printf("1 : p1:%d, &p1:%d
"
,p1,&p1); p1 = (char*)malloc(50); // p1 if(p1 == NULL) // return { return; } printf("2 : p1:%d, &p1:%d
"
,p1,&p1); if(p1 != NULL) // : p1 { free(p1); // p1 p1 printf("3 : p1:%d, &p1:%d
"
,p1,&p1); p1 = NULL; //-------------------------------------------- printf("4 : p1:%d, &p1:%d
"
,p1,&p1); } system("pause"); return 0; }

실행 결과:
1 : p1:0, &p1:6487576
2 : p1:9966560, &p1:6487576
3 : p1:9966560, &p1:6487576
4 : p1:0, &p1:6487576
       . . .

참조:https://blog.csdn.net/y396397735/article/details/48291433

좋은 웹페이지 즐겨찾기