mhs4670   2년 전

안녕하세요

열공중인 학생입니다.

다름이 아니라, 

2048문제를 풀긴 풀었는데, 푸는 과정에서

카피본을 하나 만들고(copy=map;) dfs끝나고 다시 되돌려놓는(map=copy) 것을 구현할 때 이렇게 짰습니다.

for (i = 1; i <= N; i++){
for (j = 1; j <= N; j++){
copy[i][j].val = map[i][j].val;
copy[i][j].flag = map[i][j].flag;
}
}

문제풀 풀고나서 고수님들의 소스를 보는데, 어떤분이 배열복사를 이렇게 하셨더라구요.

memcpy(copy, map, sizeof(copy));

이렇게 해봐야겠다 하고 실제로 짜서 돌려봤는데..

값이 제대로 나오지 않았습니다.

그래서 dfs마다 map을 찍어봤는데(printMap) 

복사가 잘 되다가, 어느 순간부터 갑자기 뜬금없이 음수값이 들어갑니다....

왜 그런지 알아보려고 검색을 많이많이 해봣는데 도저히 이해할 수가없어서 ㅜㅜ..

여러 개를 찾아봣는데.. 2차원 배열을 생성할때는 

row끼리 메모리 상으로 연속되지 않을 수도 있다고 해서(동적배열인경우만 그럴수도있습니다)

한 줄씩 memcpy를 써보기도 했는데.. 결과는 같더라구요. 

stack 영역이 꽉차서 그러나..(정말 그럴까요..) 싶어서 MAX값을 5정도로 줄여서 해보기도 했는데..

MAX값을 다르게 하면 값이 조금 달라지긴 하더라구요(물론 음수값이.. ㅠㅠ)

도저히 이해할 수가 없어서 이렇게 고수님들께 질문을 드립니다;;

서투른 코드는 양해해주시길 바랍니다. 



seico75   2년 전

memcpy 코드 부분만 보면 문제는 없어 보입니다. MAX 값을 20으로 해도 문제가 있다면 다른 이유가 아닌가 합니다.

이 경우에는 map 을 이차원 배열로 한번에 잡아서 연속메모리이기 때문에 한번에 memcpy 가 가능하고

sizeof 도 전체 메모리 크기를 알려주므로 문제 없어 보입니다.

메모리 alignment 문제일수도 있지만....  여러 정황상 align 문제로 보기는 힘들어 보입니다.

mhs4670   2년 전

역시 그렇겠죠 ㅠㅠ.. 정말 memcpy코드만 놓고보면 문제가 없는 것같은데...

이쯤 되니 memcpy쓰기가 두려워지네요..

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