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("로또 번호 : ");
}

간접 참조 연산자를 붙이니 정상 작동하였다.

 

물론 다 완성 된 코드는 아니다.