c, c++
[C] 0xCCCCCCCC 위치를 기록하는 동안 액세스 위반이 발생했습니다.
장비 정
2021. 8. 23. 22:19
액세스 위반의 경우에는 두 가지가 있다.
1. 메모리 할당이 되지 않은 포인터를 쓴 경우.
2. 읽기 전용 메모리에 쓰기를 수행한 경우.
이 경우에는 메모리 할당이 되지 않은 포인터를 잘못 쓴 경우였다.
사실 대부분이 이런 경우가 아닐까싶다.
#include <stdio.h>
void input_nums(int *lotto_nums); // 배열에 로또 번호 입력하는 함수
void print_nums(int *lotto_nums); // 배열에 저장 된 번호를 출력하는 함수
int main(void)
{
int lotto_nums[6]; // 배열 선언
input_nums(lotto_nums); // 로또 입력함수 호출
print_nums(lotto_nums); // 저장 값 출력함수 호출
return 0;
}
void input_nums(int *lotto_nums)
{
int i;
for (i = 0; i < 6; i++)
{
printf("번호 입력 : ");
scanf("%d\n", lotto_nums[i]);
}
}
void print_nums(int *lotto_nums)
{
printf("로또 번호 : ");
}
해당 코드에서 input_nums 안의 scanf 에서 간접 참조 연산자를 붙이지 않아서 발생한 문제였다.
#include <stdio.h>
void input_nums(int *lotto_nums); // 배열에 로또 번호 입력하는 함수
void print_nums(int *lotto_nums); // 배열에 저장 된 번호를 출력하는 함수
int main(void)
{
int lotto_nums[6]; // 배열 선언
input_nums(lotto_nums); // 로또 입력함수 호출
print_nums(lotto_nums); // 저장 값 출력함수 호출
return 0;
}
void input_nums(int *lotto_nums)
{
int i;
for (i = 0; i < 6; i++)
{
printf("번호 입력 : ");
scanf("%d\n", &lotto_nums[i]); // 간접 참조 연산자를 붙였다
}
}
void print_nums(int *lotto_nums)
{
printf("로또 번호 : ");
}
간접 참조 연산자를 붙이니 정상 작동하였다.
물론 다 완성 된 코드는 아니다.