프로그램 수행중..
글쓴이: harisoo / 작성시간: 화, 2006/08/29 - 6:02오후
제가 프로그램을 하나 만들어서 돌리고 있습니다.
배열을 대략 1kbte정도 사용하는데요..(소스가 워낙 길어서 올리기가 난감하네요ㅠㅠ)
문제는 프로그램이 수행하는 도중에 배열의 주소가 바뀝니다.
프로그램 상에서는 해당 배열의 내용을 참조만 할 뿐 수정은 하지 않거든요.
주소가 갑자기 바뀌게 되어 세그폴트가 되는데 왜 바뀌는지 이유를 알 수가 없습니다.
배열의 크기가 문제인가요?
고수님들의 답변 바랍니다.
감사합니다.
Forums:
주소가 바뀌는 것을
주소가 바뀌는 것을 어떻게 확인하셨는지요?
주소가 바뀌는건
프로그램 코드내에서 바뀌는 배열의 주소를 계속 프린트 하도록 넣었습니다.
지금 제 코드가 여러개의 배열중 하나의 배열을 선택해서 그 배열의 크기만큼 루프를 돌리고 있는데요.
처음에 세그폴트 날때의 배열의 위치값으로 처음 루프 시작할때 부터 그 위치에 해당하는
배열의 주소를 찍도록 했는데 어느 순간에 갑자기 바뀌더군요 ...
배열의 주소를
배열의 주소를 프린트하는 코드를 좀 보여주세요.
가능하면 전체 구조를 단순화해서 테스트용 프로그램을 만들고 그 코드를 보여주시는 게 좋겠습니다.
정적 배열이라 한다면
const 취급이라 주소 수정이 안 될 텐데요?
함수에 인자로 넘겨줄 때 const 지정을 안 하고 포인터로 넘겨줘서 문제가 생긴 게 아닌가 싶습니다...
찾기 힘드시다면 인자를 넘겨줄 때 const로 해주시는 것도 한 방편이 될 것 같습니다.
스택이 의심 스럽군요.
우선 배열의 주소가 바뀌는 시점을 찾는게 중요해 보입니다.
제 경험에 의하면 이런 경우 대부분이 스택을 깨먹는 경우더군요.
특정 함수 실행 후 돌아 왔을때 즉 스택에서 레지스터로 값을 복원할때 스택에 들어있는 값이 변경되어 있어 값이 바뀌는 경우를 생각해볼 수 있습니다.
------------------------------
혹시 recursive
혹시 recursive function이 있다면 의도와 무관하게 수천번 작동하고 있지는 않은지,
배열을 선언한 부분 앞뒤로 포인터나 다른 배열이 있는지, 이부분에 strcpy(), memcpy(), memset() 등등의 쓰기 함수가 엉터리로 작동하고 있는 것은 아닌지등을 확인해보시지요.
적어도 C에서는 모든 문제는 for/while 이 만들어냅니다.
댓글 달기