인프런 커뮤니티 질문&답변

gusejr0425님의 프로필 이미지
gusejr0425

작성한 질문수

IT 기업 취업을 위한: 코딩테스트 혼자서 정복하기 (C/C++)

아파트 단지 문제

해결된 질문

작성

·

205

0

안녕하세요. 아파트 단지 문제를 직접 구현하다가 생긴 궁금증입니다.

강의와 다르게 grid 배열을 지역변수로(main 함수 안에) 정의한 후 초기화 없이 scanf를 사용하면 이상한 값이 저장되던데 혹시 이유를 알고 계신지 궁금합니다. 참고로 grid 배열을 main함수 안에서 정의한 후 0으로 초기화를 먼저 해주고 scanf를 사용하면 잘 동작합니다.

좋은 강의 올려주셔서 감사합니다.

답변 2

1

조이스터디님의 프로필 이미지
조이스터디
지식공유자

안녕하세요.

코드를 살펴보면, 질문자님께서는 grid 배열을 int로 설정해주셨습니다.

그리고 이어서 scanf는 %c 형식지정자를 사용하여 char를 입력받고 있습니다.

 이 경우, 초기화되지 않은 int 변수의 4바이트 중 1바이트만 초기화하는 결과를 만들게 됩니다.

 

psdueo code로 나타내면 다음과 같습니다.

printf("%p", grid[i][j]); //uninitialized four bytes, 0xdeaddead
scanf(" %c", &grid[i][j]); //Initialize only ONE byte
printf("%p", grid[i][j]); //Result in 0xdeadde00

즉, 쓰레기값 0xdeaddead 중 시작주소(&grid[i][j])의 1바이트만 0x00으로 초기화되어 0xdeadde00이 된 것이며, 이를 %d 형식지정자를 사용하여 출력할 경우 여전히 쓰레기값이 들어있는 것으로 보였던 것으로 생각됩니다.

 그런데 여기서 grid[i][j] = 0을 할 경우, 이는 명시적으로 int값을 다루는 것이므로, 4바이트 전부가 0으로 초기화가 되며 정상적으로 동작한 것입니다.

 

C언어를 공부하시는 도중에 포인터 개념과 관련된 아주 좋은 예시를 찾으셨고, 이 부분이 추후 다른 전공 수업을 들으실 때 큰 도움이 되시리라 생각합니다. 다만 알고리즘 문제를 풀 때에는 동적 할당은 예상하지 못한 오류를 만드는 경우가 많기 때문에 가능하면 1)정적 배열을 2)전역변수로 지정하여 사용하는 것을 추천드립니다.

도움이 되셨다면 문제 해결로 상태 변경을 부탁드립니다.

gusejr0425님의 프로필 이미지
gusejr0425
질문자

답변 감사드립니다!! 공부하는데 많은 도움이 됐습니다 ㅎㅎ

0

조이스터디님의 프로필 이미지
조이스터디
지식공유자

안녕하세요 gusejr0425님.

정확한 소스코드를 알지 못해 확실하게 말씀드릴 수는 없지만, grid의 자료형, scanf 안에서 형식지정자를 사용한 방법 등에 영향을 받을 수 있습니다.

소스코드를 올려주시면 확인해서 답변드릴 수 있도록 하겠습니다.

마지막으로, 위 내용은 C언어 문법과 관련된 내용입니다. 따라서 본 강의에서는 C언어 문법 관련 문제점을 근본적으로 회피하고 순수하게 알고리즘에 집중하기 위해 무조건적으로 0으로 초기화를 하고 있음을 밝힙니다. (습관이 되면 좋습니다)

 

gusejr0425님이 만족하시는 답변이 되었기를 바라며, 답변 해결로 상태 변경을 부탁드립니다.

이후에도 문제를 풀거나 공부하시면서 어려운 점이 있다면 질문 올려주세요.

감사합니다.

gusejr0425님의 프로필 이미지
gusejr0425
질문자

int main() {

int N;

scanf("%d", &N);

int** grid;

grid = new int* [N];

for (int i = 0; i < N; i++)

{

grid[i] = new int[N];

for (int j = 0; j < N; j++)

{

// grid[i][j] = 0;

scanf(" %c", &grid[i][j]);

grid[i][j] -= '0';

printf("%d", grid[i][j]);

}

printf("\n");

}

}

grid에 입력 받기 위한 코드만 첨부합니다. 위 코드의 11번째 줄 주석을 제거하고 grid[i][j]를 0으로 초기화하면 정상적으로 입력이 되는 것을 확인했습니다.

물론 코딩테스트 시험을 보게 된다면 항상 0으로 초기화 할 예정이지만 초기화가 안 되어 있을 경우 왜 이상한 값이 저장되는지 궁금하여 질문드립니다!

감사합니다.

gusejr0425님의 프로필 이미지
gusejr0425

작성한 질문수

질문하기