3038ksh   6년 전

memset을 사용하는데 있어서 int형 배열과, char형 배열의 메모리 사용량이 다른지 궁금합니다.

int [10000]를 memset으로 초기화 시키는 코드는 메모리 초과가 나는데,

char [10000]를 memset으로 초기화 시키면 메모리 초과가 안납니다.

int가 4바이트고 char가 1바이트라서 그런 건가요?

djm03178   6년 전

당연히 다릅니다. int 하나가 4바이트니 int [10000]은 4만 바이트고, char 하나가 1바이트니 char [10000]은 1만 바이트입니다.

그런데 memset 때문에 메모리 초과가 난다는 건 이상한 말입니다. memset은 이미 할당받은 곳에 데이터를 써줄 뿐이지 메모리를 추가로 할당받는 것이 아니거든요.

22번째 줄 주석에 저걸로 '바꾸면' 메모리 초과가 난다고 하셨는데 memset(check, 0, sizeof(check)) 자체에는 아무런 문제가 없으며 단지 out 배열의 내용을 초기화하지 않는 것이 문제가 될 뿐입니다.

djm03178   6년 전

좀 더 구체적으로 설명드리자면, 27번째 줄의 탈출 조건이 out[b]가 0이 아닌 동안 돌아야 하는데 이전 테스트케이스에서 이미 어떤 문자가 들어가 있다면 루프를 한 번도 안 돌고 나오게 됩니다. 그러면 b에서부터 시작한 게 a로 가지 않고 다른 곳으로 빠진다면 print를 할 때 예를 들면 0이라는 인덱스에 가서 무한히 제자리를 도는 재귀호출을 할 수 있고, 재귀호출이 될 때마다 사용 메모리가 증가하여 메모리 초과를 받게 됩니다.

3038ksh   6년 전

아뇨아뇨 물론 그 조건도 바꿨습니다.

그러나 memset을 int 배열을 초기화 하면 문제가 되는데 그렇지 않은 경우가 문제입니다...

문제의 소스를 추가하겠습니다.

djm03178   6년 전

그 역시 memset의 문제가 아닙니다. 이 코드와 처음에 올려주신 코드를 보면 다른 차이점이 있습니다.

처음의 코드는 while (!out[b]) 로 탈출을 검사하지만, 방금 올려주신 코드는 while (true)로 루프를 돌고 out이 아닌 check[b]로 탈출 조건을 걸었습니다. 이렇게 하면 check[b]가 0일 때 그 0이 "아직 아무것도 안 넣은 상태"인지 아니면 "0이라는 유효한 값"인지를 판별하지 못합니다. 0일 때 L 연산과 R 연산은 동일한 0 값을 반환하는데, 루프를 빠져나가지 못하고 매 루프마다 0이 2개씩 큐에 들어가고 하나씩 나오니 결국 메모리를 초과하게 됩니다.

처음의 코드는 모든 검사를 check 대신 out으로 하고 있어 이런 문제가 발생하지 않습니다.

https://www.acmicpc.net/source... 여기 둘 다 memset을 하고 정답을 받은 코드입니다.


djm03178   6년 전

+ L, R 뿐만 아니라 D도 0을 반환하니 루프 1회당 2개씩 큐에 추가됩니다.

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