편집 기록

편집 기록
  • 프로필 BBCheetah님의 편집
    날짜2022.01.19

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


    문제의 코드입니다. 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;
        }
    }
    
  • 프로필 nowp님의 편집
    날짜2022.01.18

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


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

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

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

    라고 하네요.

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

    #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;
        }
    }
    
  • 프로필 BBCheetah님의 편집
    날짜2022.01.18

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


    문제의 코드입니다. gcc로 컴파일하면서 잘 하다가.. visual studio로 넘어오니 여러 문제들이 생겼습니다. scanf 등등은 맨 윗 줄을 붙여서 해결하고.. 어찌저찌 하는데.. 메인 함수 말고 다른 함수들에서 Node* curr 써주고 curr 이나 curr->멤버변수 를 사용하려니 문제가 생깁니다.

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

    라고 하네요..

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

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