강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

r3657님의 프로필 이미지
r3657

작성한 질문수

처리되지 않은 예외 발생: 읽기 액세스 위반. ptr은 0xFFFFFFFFFFFFFFFF7이었습니다.

작성

·

1K

0

#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;
}
}

r3657님의 프로필 이미지
r3657

작성한 질문수

질문하기