처리되지 않은 예외 발생: 읽기 액세스 위반. ptr은 0xFFFFFFFFFFFFFFFF7이었습니다.
1117
작성한 질문수 1
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
typedef struct Node {
int data;
struct Node* next;
}Node;
void init(Node* A);
void AddEnd(Node* A, int B);
void RemoveEnd(Node* A);
void CheckLinkedList(Node A);
int main() {
Node node;
Node* nodeptr = &node;
init(nodeptr);
AddEnd(nodeptr, 10);
AddEnd(nodeptr, 20);
AddEnd(nodeptr, 30);
AddEnd(nodeptr, 40);
AddEnd(nodeptr, 50);
AddEnd(nodeptr, 60);
CheckLinkedList(node);
return 0;
}
void init(Node* A) {
A = NULL;
}
void AddEnd(Node* A, int B) {
Node* ptr = NULL;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = B; // 데이터 할당
newNode->next = NULL; // next 포인터 초기화
if (A == NULL) { // empty
A = newNode;
return;
}
else {
// not empty, 가장 앞에 노드 추가
if (A->data > newNode->data) {
newNode->next = A;
A = newNode;
return;
}
int i = 0;
for (ptr = A; ptr->next; ptr = ptr->next) {
if (i >= MAX - 1) {
printf("더 추가 할 수 없습니다!\n");
return;
}
}
ptr->next = newNode; // 마지막에 노드 추가
}
}
void RemoveEnd(Node* A) {
Node* ptr = A;
if (ptr == NULL) {
printf("리스트가 비었습니다!\n");
return;
}
for (ptr = A; ptr; ptr = ptr->next) {
if (ptr->next == NULL) { free(ptr); return; }
}
}
void CheckLinkedList(Node A) {
for (Node* ptr = &A; ptr; ptr = ptr->next) {
printf("%d\n", ptr->data);
}
}ptr = A; ptr->next; ptr = ptr->next에서
처리되지 않은 예외 발생: 읽기 액세스 위반.
ptr은 0xFFFFFFFFFFFFFFFF7이었습니다. 가 뜹니다.
Clion에서는 되던 코드가 vs에서 안돼서 당황스럽습니다 ㅠ
답변 1
0
안녕하세요, 인프런 AI 인턴이에요.
해당 코드에서 발생한 에러는 읽기 액세스 위반(reading access violation)으로 포인터가 NULL인 상태에서 해당 포인터에 접근하려고 시도하여 발생한 에러입니다.
init 함수에서 매개변수로 받은 A를 NULL로 초기화하고 있지만, 이는 main 함수에서 nodeptr이 가리키는 node 구조체에 영향을 주지 않습니다. Node 포인터 A도 main 함수에서 선언한 node 포인터와 같은 구조체를 가르키고 있지만, A에 대한 값 변경은 nodeptr과 연관이 없으므로, A가 NULL을 가리키더라도 nodeptr이 가리키는 구조체에 대한 초기화가 이루어지지 않습니다.
따라서, init 함수에서는 매개변수로 받은 A가 가리키는 구조체 내의 next 멤버를 NULL로 초기화하도록 수정해야합니다. 그리고 AddEnd 함수 내에서도, 포인터 변수인 A가 가리키는 구조체 내부에서 변경해야 하므로 A 대신 A에 해당하는 포인터 변수의 값을 변경해야 합니다.
아래는 수정된 코드입니다.
#include
#include
#define MAX 10
typedef struct Node {
int data;
struct Node* next;
}Node;
void init(Node** A);
void AddEnd(Node** A, int B);
void RemoveEnd(Node** A);
void CheckLinkedList(Node* A);
int main() {
Node node;
Node* nodeptr = &node;
init(&nodeptr);
AddEnd(&nodeptr, 10);
AddEnd(&nodeptr, 20);
AddEnd(&nodeptr, 30);
AddEnd(&nodeptr, 40);
AddEnd(&nodeptr, 50);
AddEnd(&nodeptr, 60);
CheckLinkedList(nodeptr);
return 0;
}
void init(Node** A) {
(*A)->next = NULL;
}
void AddEnd(Node** A, int B) {
Node* ptr = NULL;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = B;
newNode->next = NULL;
if (*A == NULL) {
*A = newNode;
return;
}
else {
if ((*A)->data > newNode->data) {
newNode->next = *A;
*A = newNode;
return;
}
int i = 0;
for (ptr = *A; ptr->next; ptr = ptr->next) {
if (i >= MAX - 1) {
printf(“더 추가 할 수 없습니다!\n”);
return;
}
}
ptr->next = newNode;
}
}
void CheckLinkedList(Node* A) {
Node* ptr = A;
printf(“list: “);
while (ptr != NULL) {
printf(”%d “, ptr->data);
ptr = ptr->next;
}
}
어플리케이션 실행 후 에러에 관하여 질문 드립니다.
2
26
2
5강때 초보가 겪었던 어려움 공유 (극복완료)
1
59
2
지원동기에 대하여
1
47
2
피그마 스킬설치 강의 중 피그마 디자인 파일 링크 관련 문의
1
37
2





