visual studio 2019에서 <예외가 throw됨: 읽기 액세스 위반입니다.> 를 어떻게 해결해야 하나요?

조회수 693회

문제의 코드입니다. gcc로 컴파일하면서 잘 하다가 visual studio로 넘어오니 여러 문제들이 생겼습니다.

scanf 등등은 맨 윗 줄을 붙여서 해결하고, 어찌저찌 했는데, 메인 함수 말고 다른 함수들에서 Node* curr 써주고 curr 이나 curr->멤버변수 를 사용하려니 문제가 생깁니다.

<예외가 throw됨: 읽기 액세스 위반입니다.
**curr**이(가) 0xCDCDCDCD였습니다.>

라고 하네요.

curr을 어떻게 손을 대야 할 지 감이 하나도 오지 않습니다.

+추가합니다. curr 에서

<문자열의 문자를 읽는 동안 오류가 발생했습니다.>

라고 하네요. 거기다 curr->stud_idcurr->stud_score의 값이 ?? 라고 뜨네요.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> // 동적메모리관리에 필요함.
#include <string.h> // 문자열 관련에 필요함.

//==================================================================//

// 리스트 노드 구조체 선언
typedef struct studentNode {
    char name[20];
    int stud_id;
    float stud_score;
    struct studentNode* link;
}Node;

// 전역변수들
Node* L = NULL; // 헤더
int N, i; // 노드 개수 카운트

//==================================================================//

// 학생 추가 함수
void insertStudent() {
    char a[20]; // 이름 입력 변수
    int b=0; // 학번 입력 변수
    float c=0; // 학점 입력 변수

    printf("\n추가 대상 학생의 이름을 입력하세요 : ");
    scanf("%s", a);

    Return1:
    printf("\n추가 대상 학생의 학번을 입력하세요 : ");
    scanf("%d", &b);
    Node* curr = L;
    while (curr != NULL) {
        if (b == curr->stud_id) {
            printf("\n동일한 학번의 학생이 존재합니다.\n");
            goto Return1;
        }
        else {
            curr = curr->link;
        }
    }

    Return2:
    printf("\n추가 대상 학생의 학점을 입력하세요 : ");
    scanf("%f", &c);
    if (!(c >= 0 && c <= 4.5)) {
        printf("\n잘못된 범위입니다.\n");
        goto Return2;
    }

    Node* node = (Node*)malloc(sizeof(Node));
    if (node == NULL) {
        exit(1);
    }
    strcpy(node->name, a);
    node->stud_id = b;
    node->stud_score = c;

    if (L == NULL) {
        L = node;
    }
    else {
        Node* curr = L;
        Node* pre = NULL;
        int n = 1;
        while (curr != NULL) {
            printf("%d", strcmp(node->name, curr->name));
            if (strcmp(node->name, curr->name) > 0) {
                pre = curr;
                curr = curr->link;
                n++;
            }
            else if (strcmp(node->name, curr->name) <= 0) {
                if (n == 1) {
                    node->link = curr;
                    L = node;
                    break;
                }
                else {
                    node->link = curr;
                    pre->link = node;
                    break;
                }
            }
        }
        if (curr == NULL) {
            node->link = NULL;
            pre->link = node;
        }
    }
    N++;
}

// 학생 제거 함수
void deleteStudent(char* a) {
    Node* curr = L;
    Node* pre = NULL;
    for (i = 1; i <= N; i++) {
        if (strcmp(curr->name, a)) {
            pre = curr;
            curr = curr->link;
        }
        else {
            if (i == 1) {
                L = curr->link;
            }
            else if (i == N) {
                pre->link = NULL;
            }
            else {
                pre->link = curr->link;
            }
            free(curr);
            N--;
            break;
        }
    }
    if (curr == NULL) {
        printf("\n해당 학생이 없습니다.\n");
        printf("\n계속하려면 아무 키나 입력하십시오...\n");
        system("PAUSE");
    }
}

// 학생 조회 함수
void searchStudent(char* a) {

    Node* curr = L;
    while (curr != NULL) {
        if (strcmp(curr->name, a)) {
            curr = curr->link;
        }
        else {
            printf("\n[%s]\n학번 : %06d\n평균 학점 : %.1f\n", curr->name, curr->stud_id, curr->stud_score);
            break;
        }
    }
    if (curr == NULL) {
        printf("\n해당 학생이 없습니다.\n");

    }
    printf("\n계속하려면 아무 키나 입력하십시오...\n");
    system("read");
}

// 리스트 전체 출력 함수
void printAllStudent() {
    if (L == NULL) {
        printf("\n학생이 하나도 없습니다.\n");
    }
    else {
        Node* curr = L;
        while (curr != NULL) {
            printf("\n[%s]\n학번 : %06d\n평균 학점 : %.1f\n", curr->name, curr->stud_id, curr->stud_score);
            curr = curr->link;
        }
    }
    printf("\n계속하려면 아무 키나 입력하십시오...\n");
    system("PAUSE");
}

// 리스트 초기화 함수
void deleteAllStudent() {
    if (L == NULL) {
        printf("\n학생이 하나도 없습니다.\n");
    }
    else {
        Node* curr = L;
        while (curr != NULL) {
            free(curr);
            curr = curr->link;
        }
        L = NULL;
        N = 0;
    }
    printf("\n계속하려면 아무 키나 입력하십시오...\n");
    system("PAUSE");
}

// 메인 함수
void main() {
    system("cls");

    int n = 0;
    char a[20] = { 0 };
    printf("\n======================[학생 관리 프로그램]======================\n[1] 학생 추가\n[2] 학생 제거\n[3] 학생 조회\n[4] 학생 리스트 전체 출력\n[5] 학생 리스트 초기화\n[6] 프로그램 종료\n===============================================================\n");
    printf("\n원하는 항목의 번호를 입력하세요 : ");
    scanf("%d", &n);
    switch (n) {
    case 1:
        insertStudent();
        main();
        break;
    case 2:
        printf("\n제거 대상 학생의 이름을 입력하세요 : ");
        scanf("%s", a);
        deleteStudent(a);
        main();
        break;
    case 3:
        printf("\n조회 대상 학생의 이름을 입력하세요 : ");
        scanf("%s", a);
        searchStudent(a);
        main();
        break;
    case 4:
        printAllStudent();
        main();
        break;
    case 5:
        deleteAllStudent();
        main();
        break;
    case 6:
        deleteAllStudent();
        printf("\n프로그램을 종료합니다.\n");
        break;
    default:
        printf("\n잘못된 입력입니다.\n");
        printf("\n계속하려면 아무 키나 입력하십시오...\n");
        system("PAUSE");
        main();
        break;
    }
}

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)