dreamian   6년 전

안녕하세요. 혼자서 도저히 해결할 수 없어서 질문 올리게 되었습니다.

문제를 풀다가 디버깅을 하는 과정에서 scanf가 씹히는 현상을 발견했습니다.

대부분의 인풋 데이터는 잘 돌아가는데, 문자열의 길이가 20이 되는 경우가 연속으로 30개 있을 때 씹히더라구요..

getchar로 버퍼를 없애주거나 fgets를 이용하거나 어떤 방법으로 접근해도 안 되던데 이걸 어떻게 해결할 수 있는 방법이 있을까요?

스크린샷 2017-12-25 오후 4.06.12.png

인풋 데이터는 다음과 같습니다.

30
aaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
baaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
caaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
daaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
eaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
faaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
gaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
haaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
iaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
jaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
kaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
laaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
maaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
naaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
oaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
paaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
qaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
raaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
saaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
taaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
uaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
vaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
waaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
xaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
yaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
zaaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
abaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
bbaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
cbaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn
dbaaaaaaaaaaaaaaaaaa jeroenabcdefghijklmn


어떤 점이 문제일까요?ㅠㅠ

dreamian   6년 전

문제를 free를 선언하지 않고 아래의 코드와 같이 제출하니 해결되었습니다.

동적 할당을 한 이후에는 free로 메모리 해제를 해주어야 한다고 알고 있었는데 어떤 점에서 문제가 생겼던 것인지 궁금합니다.


해결방식:

1) 동적할당 시에 입력된 n만큼 할당하지 않고 n의 최대 갯수인 30을 while문 밖에 선언하였음.

2) free 선언을 안 하고 프로그램 종료.


while문 밖에 free선언을 시험삼아 해보았는데,

arr이랑 num이랑 선언되지 않은 변수라고 하며 에러가 뜨는데 혹시 이게 while문이 끝남과 동시에 메모리가 자동으로 반납되는 것인지 궁금합니다!

sgchoi5   6년 전

1) PS (Problem Solving) 배울 때에 .. 필요한 변수는 전역 변수로 (지역 변수는 스택(보통 1MB)에 잡혀서 문제될 수 있으니..) 크기 문제가 없다면 미리 잡아 두라고 배웠고,    이 문제는 n 이 작아서 가능한 최대치를 미리 잡아 두어도 상관없습니다... 문제 해결에만 집중하고 memory alloc / free 와 같이 크게 중요하지 않는 것에서 코드/시간 낭비 하지 말라고...

2) free 에 입력으로 들어오는 변수(arr, num)가 지역 변수이니 유효한 코드 블럭 밖에서 사용하신듯..

3) 자동으로 free 되지 않습니다..  

4) 첫 번째 코드는 arr[i] 에 잘못된 크기로 malloc 을 잡아서 그런 것 같습니다... 

    두 번째 코드는 바르게 수정하셨으니 free 해도 될 듯 한데요..



dreamian   6년 전

답변 달아주셔서 정말 감사합니다.

지적해주신대로 제가 너무 메모리 관리하는 것에만 의존해서 코드를 작성해온 것 같습니다.(실제 malloc, free를 어떻게 다루는 지에 대한 개념도 부족한 상태인데 말이죠..)

문제를 해결할 당시에 free 선언을  while문 내외(54line, 56line)에 각각 해주었을 때 오류가 발생하였습니다.

무언가 문제가 있었을 것 같은데 한번 해결해보겠습니다.

메모리 할당에 대해서는 충분히 공부를 해두고 사용하도록 하겠습니다.

감사합니다!


댓글을 작성하려면 로그인해야 합니다.