c언어 포인터 메모리사이즈에 대한 질문드립니다
글쓴이: lsc1117 / 작성시간: 토, 2016/04/02 - 2:00오후
아주 초보적인 질문입니다
int *ptr
int형 포인터 변수를 선언하였습니다. sizeof 해보면 4바이트인 것을 알 수 있습니다
ptr = (int *)malloc(sizeof(int));
ptr 포인터변수에 4바이트 만큼의 공간을 할당하였습니다.
============ 그런데 여기서 질문입니다 ===========
제가 이해하기로는 위 작업을로 ptr에 할당된 메모리는 주소공간 4byte + malloc으로 한 데이터공간 4byte 합이 8byte라 생각하였습니다.
제가 생각한 것이 틀린건지
ptr[1] = 3;
ptr[2] = 4;
이런것들이 모두 segmentation fault 없이 잘 동작하던데 그럼 제가 생각한 8byte의 메모리할당이 아닌것인데...
이건 뭐 int ptr[9999999999]와 같은건데...
위에 제가 생각한 것중 어느부분이 틀린것인가요??
Forums:
아마도.....
아마도 C에서는 선언한 배열의 크기보다 큰 영역에 접근할때 오류가 안나고 침범하는 걸로 알고 있어요.
얼마전에도 제가 배열 a[20] b[20]을 선언하고 b[]에서 20이 넘는 위치를 참조해서 데이터를 입력시켰는데 a배열로 데이터가 저장되는데 오류는 뜨지 않더라구요 ㅎㅎ
여기서 a[]로 넘어간거는 우연이겠지만 말이죠 ㅎ
아... 정상이군요
관련해서 좀더 검색해보니 혹시 페이징이 관련이 있을수 있다 생각하였습니다
MMU에서 페이지폴트를 처리한다는데 좀더 구글링 해봐아ㅏ 겠습니다 ㅎㅎ
감사합니다
페이징하고 관련된 것 맞구요.
https://kldp.org/node/153150
예전에 답변 달아놓은게 있네요.
PS. 찾아보니 MMU 관련해서 잘못 글을 달았네요. 해당부분 지웁니다.
비정상입니다...
제 짧은 소견을 말하겠습니다. 안 맞는 부분은 고수들의 정정 부탁드립니다.
지금 할당하신 메모리는 8bytes, 4bytes는 스택에 4 bytes는 힙에 할당이 될겁니다. 힙에 4bytes를 malloc으로 할당해도 실제로는 조금 더 잡힙니다. 예를 들면 할당된 주소 어드레스 이전 4bytes에 전체 할당된 길이가 저장되어서, 나중에 free할때 정확하게 할당된 바이트만큼 해제합니다.
지금 말씀하신 segmentation fault는 엑세스가 금지된 지역에 엑세스 할때 발생합니다. 예를 들어서 지금 프로그램에서 ptr를 null로 세팅하고, [0], [1] , [2]로 인덱싱하면 아마 segmentation fault가 뜰겁니다. ptr[1], ptr[2]에 값을 할당해도 엑세스가 가능한 지역이면 그냥 에러없이 진행이 됩니다. 이게 가장 디버깅이 힘든 에러입니다. 왜냐하면 이때, 그다음 메모리 영역을 할당받은 프로그렘에서 에러가 생깁니다. 왜냐하면 그 프로그램의 의사와 상관없이 값이 바뀌니까요. 물론 어떨때는 에러가 안생기도 하겠지만, 대개는 생깁니다. 그럼 나타나는 현상은 프로그램의 이곳 저곳에서 문제가 생깁니다. 원인은 하나인데, 나타나는 에로 결과는 여러군데 흩어져 있으므로, 디버깅할려면 골치를 썩힙니다. 프로그램이 좀 크면, 전체 프로그램을 뒤져봐야 합니다. 요즘은 valgrind라던가 메모리에 월을 세워서 할당된 영역을 넘어서 엑세스하는 것을 디버깅하는 툴로 하면 간단할수도 있지만, 테스트는 좋지만, 실전에서는 절대, 절대로 해서는 안됩니다.
댓글 달기