C+읽 기 접근 권한 충돌 로 인 한 이상 문제 의 원인 분석
1.방문 배열 의 경 계 를 넘 습 니 다.
선형 표 의 순서 구조,예 를 들 어 순서 표,대기 열,스 택 등 을 사용 하여 배열 로 데 이 터 를 저장 할 때 데 이 터 를 읽 을 위치 가 현재 배열 의 길 이 를 초과 하면 배열 이 경 계 를 넘 는 상황 이 발생 합 니 다.
그러나 이것 은 컴 파일 오 류 를 일 으 키 지 않 습 니 다.즉,컴 파일 러 는 컴 파일 할 때 배열 의 경 계 를 넘 었 다 고 지적 하지 않 습 니 다.이 때 는'0 errors,0 warnings'일 수도 있 습 니 다.
코드 에 bug 가 없어 서 다행 이지 만 실행 되면 접근 권한 충돌 의 이상 을 던 집 니 다.
예 를 들 어 다음 단락 의 대기 열과 창고 작업
struct Stack //
{
int data[maxSize]; //
int top; //
};
struct Queue //
{
int elements[2000]; // 2000
int front; //
int rear; //
};
while (queueA->front < queueA->rear || queueB->front < queueB->rear)
{
queueA->front++;
inStack(stack, queueA->elements[queueA->front]);
outStack(stack, queueA);
queueB->front++;
inStack(stack, queueB->elements[queueB->front]);
outStack(stack, queueB);
}
//inStack
//outStack ,
컴 파일 에 성공 한 것 은 잘못 되 지 않 았 으 나 실행 후 읽 기 접근 권한 충돌 의 이상 을 던 졌 습 니 다.우 리 는 이때 부분 변수의 상 태 를 살 펴 보면 대기 열 A 의 팀 헤드 포인터 와 팀 꼬리 포인터 가 모두 이상 한 하 표를 가리 키 고 있 음 을 알 수 있다.
이 는 분명히 경 계 를 넘 는 상황 이 발생 했다.길이 가 2000 인 배열 이기 때문에 아래 표 시 된 수 치 는 0~1999 일 것 이다.
나중에 while 순환 판정 조건 에서 오류 가 발생 한 것 을 발견 했다.본 의 는 A,B 사이 의 임의의 대기 열 에 있 는 요소 가 비어 있 을 때 순환 을 뛰 어 넘 는 것 입 니 다.그러나 판정 조건 의 논 리 를 논리 적 으로 잘못 쓰 거나 순환 을 뛰 어 넘 지 못 하 게 만 들 었 습 니 다.최종 대기 열 A 의 팀 헤드 포인터 와 팀 꼬리 지침 은 끊 임 없 는 순환 작업 에서 배열 경 계 를 초과 하여 읽 기 접근 권한 충돌 의 이상 이 발생 했 습 니 다.
while 의 판정 조건 을 수정 하면 프로그램 이 정상적으로 실 행 될 수 있 습 니 다.
따라서 접근 권한 충돌 을 읽 는 알림 을 만 났 습 니 다.배열 의 데 이 터 를 읽 을 때 이상 이 발생 하면 어떤 조작 이 잘못 되 어 방문 배열 이 경 계 를 넘 었 는 지 우선 고려 할 수 있 습 니 다.
2.빈 포인터 이상
이것 은 주로 포인터 로 데 이 터 를 읽 을 때 발생 한다.예 를 들 어 링크 를 사용 하 는 과정 에서 발생 한다.
예제:링크 의 조작
struct Node //
{
int data;
Node* next;
};
LinkListInvert::LinkListInvert(int arg[],int n)
{ //
Node* r = first;
Node* s = nullptr;
for (int i = 0; i < n; i++)
{
s = new Node;
s->data = arg[i];
r->next = s;
r = s;
}
r->next = nullptr;
}
코드 컴 파일 에 오류 가 없습니다.실행 후 읽 기 접근 권한 이상 이 발생 합 니 다.first 포인터 가 초기 화 되 지 않 아 first 포인터 가 빈 포인터 가 되 어 불확실 한 값 을 가리 키 고 그 다음 에 진행 되 는 동작 임 을 알 수 있 습 니 다.
Node* r = first;
r 포인터 도 빈 포인터 가 되 었 고 다음 작업 을 할 때 읽 기 권한 충돌 의 이상 을 던 졌 습 니 다.
LinkListInvert::LinkListInvert(int arg[],int n)
{
first = new Node; // , first
Node* r = first;
Node* s = nullptr;
for (int i = 0; i < n; i++)
{
s = new Node;
s->data = arg[i];
r->next = s;
r = s;
}
r->next = nullptr;
}
수정 하 는 방식 도 간단 하 다.first 지침 을 초기 화하 면 실행 에 성공 할 수 있다.포인터 가 초기 화 되 지 않 아 발생 하 는 읽 기 접근 권한 이상 과 유사 하 며,0xCCCCCC,0xCDCDCD 와 같은 이상 알림 도 제공 합 니 다.
물론 링크 뿐만 아니 라 빈 포인터 이상 은 데이터베이스 조회,포인터 가 초기 화 되 지 않 았 을 때 도 빈 포인터 이상 이 발생 할 수 있 습 니 다.
총결산
C++읽 기 권한 충돌 로 인 한 이상 문 제 를 일 으 키 는 이 글 을 소개 합 니 다.더 많은 관련 C+읽 기 권한 충돌 내용 은 이전 글 을 검색 하거나 아래 글 을 계속 찾 아 보 세 요.앞으로 도 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1717 소수 화 점수 2 (수학)소수 화 점수 2 레이 는 수학 시간 에 선생님 의 말씀 을 듣 고 모든 소수 가 점수 로 표시 되 는 형식 이 라 고 말 했다. 그 는 녹 기 시 작 했 고 곧 완성 되 었 다. 그러나 그 는 또 하나의 문 제 를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.