게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C언어 ) 동적할당하다가 realloc을 썼는데 힙에러 뜨는 경우 해결법
게시물ID : programmer_17212짧은주소 복사하기
작성자 : 나즈란
추천 : 1
조회수 : 1502회
댓글수 : 2개
등록시간 : 2016/05/14 20:57:38
realloc의 특징이 기존의 동적할당을 해제하고
다시 재할당하는 것입니다.

예를 들어 배열의 크기가 5일때 그 배열을 realloc을 사용해서 재할당을 시켜준다면
기존의 배열의 포인터를 시작주소로 재할당합니다.

하지만 기존의 포인터에 데이터를 할당하기에 재할당한 배열의 크기가 너무 크다면 (예를 들어 100)
넉넉한 공간의 제3의 주소로 가서 재할당합니다.

예를 들어 시작주소가 1이라고 가정했을때 힙공간이 부족하다면
제 3의 주소인 500을 시작주소로 변경될수 있다는 것이죠



그런데 malloc와 realloc을 다른 함수에서 사용하였다고 가정한다면?

메인함수에서 malloc
enter_number 함수에서 realloc을 사용하였다고 생각해봅시다. 

이 경우 enter_number함수에서 배열의 시작주소가 변경되었다 하더라도 (1->500)
메인함수로 되돌아온다면 기존의 시작주소로 되돌아갑니다 (1)

힙공간이 부족해서 재할당을 했는데 100만큼을 끌어다 쓴다면? 다른 공간을 침범해서 힙에러가 뜨는 것이죠

이것을 방지하고자 2가지 방법이 있는데
이중포인터를 사용하는 방법이 있습니다 그런데 이건 잘 모릅니다;;

다른 방법은 포인터를 리턴하는 것입니다.
enter_number 함수에서 배열의 시작주소를 리턴하고 메인함수에서는 그것을 받아서 포인터를 갱신하는 것이죠
배열명이 number이라고 가정했을때

enter_number함수에서  return number; 을 써줍니다 (배열명은 포인터명과 같다고 보시면 됩니다.)
메인함수에서는 number=enter_number(number) 이렇게 써주면 되겠지요  (1->500 으로 갱신)

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호