eogns0321   3년 전

코드에서 int N;  이 부분을 main 안에 넣으면 맞고 전역 변수로 두면 틀리네요...

이유가 뭔가요???

ls123kr   3년 전

아마 입력값이 boundary (ex. n=1,500,000) 과 같은 값이 들어갔을 때 문제가 되는 것 같은데요.

int N; 이 전역으로 선언되면, N과 dp 변수가 전역메모리 상에서 연속적으로 할당이 되어 있겠죠. 

그런데, 26, 29 line 에서 dp[i+1] 의 값을 참조하고 있으니 n=1,500,000 과 같은 값이 입력으로 들어가게 되면, 아마 26line에서 의도치않은 값이 ( N값 ) 들어갈 것이라 생각되네요.

지역변수로 할당하면 위 문제가 발생하지 않으니 정답으로 처리되구요.

dp 배열 크기를 1,500,002 로 해주시면 int N 을 전역으로 선언해도 정답처리 될 것 같습니다.

eogns0321   3년 전

@ls123kr

ls123kr

댓글 감사합니다. 그런데 말씀해주신 이야기대로면 N이 지역변수이든 전역변수이든 똑같이 문제가 발생해야 하지 않나요?

N이 만약 지역변수이고 N에 1,500,000 즉, boundary 값이 들어간다고 가정하면

i=N일때 즉, i = 1,500,000 이고 dp[i+1]을 참조할 경우 배열에 할당된 메모리를 벗어난 주소를 참조하게 되어 문제가 발생하고,

N이 전역변수면 말씀해주신 것과 같이 연속적으로 할당되어 있는 N값이 읽히게 되어 문제가 발생하지 않나요...??

틀린 부분 다시 한번 알려주시면 정말 감사하겠습니다.

ls123kr   3년 전

변수마다 메모리에 할당되는 위치가 달라서 그래요. 운영체제에 나오는 내용인데요(http://www.tcpschool.com/c/c_m...)

지역변수는 스택 영역에 생성되고, 전역변수는 데이터 영역에 생성되기 때문에 전역으로 만들었을 때는 제가 말씀드린 문제가 발생하고,

지역변수로 만들었을 시에는 N은 스택 영역, 배열들은 데이터 영역에 생성되기 때문에 연속적으로 참조되지 않습니다.

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