visual studio 2019에서 <예외가 throw됨: 읽기 액세스 위반입니다.> 를 어떻게 해결해야 하나요?
조회수 693회
문제의 코드입니다. gcc로 컴파일하면서 잘 하다가 visual studio로 넘어오니 여러 문제들이 생겼습니다.
scanf
등등은 맨 윗 줄을 붙여서 해결하고, 어찌저찌 했는데,
메인 함수 말고 다른 함수들에서 Node* curr 써주고 curr 이나 curr->멤버변수 를 사용하려니 문제가 생깁니다.
<예외가 throw됨: 읽기 액세스 위반입니다.
**curr**이(가) 0xCDCDCDCD였습니다.>
라고 하네요.
curr을 어떻게 손을 대야 할 지 감이 하나도 오지 않습니다.
+추가합니다. curr 에서
<문자열의 문자를 읽는 동안 오류가 발생했습니다.>
라고 하네요. 거기다 curr->stud_id 나 curr->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 답변
-
https://www.softwareverify.com/memory-bit-patterns.php
0xcdcdcdcd
The 0xcdcdcdcd bit pattern indicates that this memory has been initialised by the memory allocator (malloc() or new) but has not been initialised by your software (object constructor or local code).
If you are seeing the 0xcdcdcdcd bit pattern it means that you are reading memory that has been allocated by malloc(), realloc() or new, but which has not been initialised.
댓글 입력